首页 > 数据库 >Redis循环慢接口优化

Redis循环慢接口优化

时间:2023-07-25 18:12:02浏览次数:46  
标签:List get keys res Redis 接口 value key 优化

原慢接口

List<String> keys = new ArrayList<>(Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"));

List<String> res = new ArrayList<>();
for (String key : keys) {
    String value = (String) redisTemplate.opsForValue().get(key);
    if (value == null) {
        value = dataMapper.getValueFromDB(key);
        redisTemplate.opsForValue().set(key, value, 60 * 60, TimeUnit.SECONDS);
        res.add(value);
    }
}
return res;

原因分析

  1. 当keys 数据过大,RTT时间会变大。

    多个Redis命令之间会有往返时间消耗。

    使用MGET、Pipelined可以减少RTT时间

  2. 首次进入此代码域,由于缓存为空,全部走数据库,也会导致接口变慢。

解决方式

Pipelined

注意:Redis集群部署时,不同的key可能对应不同实例节点,不能被处理。

List<String> keys = new ArrayList<>(Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"));

List<String> res = new ArrayList<>();
List list = redisTemplate.executePipelined((RedisCallback<Object>) connection -> {
    for (String key : keys) {
        connection.get(key.getBytes());
    }
    return null;
});
// 缓存不存在的keys
List<String> nullKeys = new ArrayList<>();
for (int i = 0; i < keys.size(); i++) {
    if (list.get(i) == null) {
        nullKeys.add(keys.get(i));
    } else {
        res.add((String) list.get(i));
    }
}
// 缓存中不存在的值调用 数据库批量查询
Map<String, String> values = dataMapper.getBatchValue(nullKeys);
// 添加返回值,并更新缓存
values.forEach((key, value) -> {
    redisTemplate.opsForValue().set(key, value, 60 * 60, TimeUnit.SECONDS);
    res.add(value);
});
return res;

MGET

List<String> keys = new ArrayList<>(Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"));

List<String> res = new ArrayList<>();
List list = redisTemplate.opsForValue().multiGet(keys);
// 缓存不存在的keys
List<String> nullKeys = new ArrayList<>();
for (int i = 0; i < keys.size(); i++) {
    if (list.get(i) == null) {
        nullKeys.add(keys.get(i));
    } else {
        res.add((String) list.get(i));
    }
}
// 缓存中不存在的值调用 数据库批量查询
Map<String, String> values = dataMapper.getBatchValue(nullKeys);
// 添加返回值,并更新缓存
values.forEach((key, value) -> {
    redisTemplate.opsForValue().set(key, value, 60 * 60, TimeUnit.SECONDS);
    res.add(value);
});
return res;

标签:List,get,keys,res,Redis,接口,value,key,优化
From: https://www.cnblogs.com/handsometaoa/p/17580562.html

相关文章

  • 封装一个Redis服务组件
    结构说明 ServiceCollectionExtensions类1usingcom.project.Redis.Common;2usingMicrosoft.Extensions.Configuration;3usingMicrosoft.Extensions.DependencyInjection;4usingSystem;56namespacecom.project.Redis7{8publicstaticclass......
  • springsession 配置redis集群
    SpringSession配置Redis集群教程1.流程概述在本教程中,我们将详细介绍如何使用SpringSession来配置Redis集群。整个流程可以总结为以下几个步骤:添加SpringSession和Redis依赖配置Redis集群连接信息配置SpringSession使用Redis集群测试SpringSession与Redis集群的连接......
  • springbootredis集群配置
    SpringBootRedis集群配置在分布式系统中,Redis是一个常用的内存数据库,用于缓存和存储数据。Redis集群是多个Redis实例的组合,通过分片和复制技术,提供高可用性和可扩展性。本文将介绍如何在SpringBoot中配置Redis集群,并提供相应的代码示例。1.搭建Redis集群首先,我们需要搭建Red......
  • springboot2整合redis
    SpringBoot2整合Redis概述本文旨在指导刚入行的开发者如何在SpringBoot2中实现Redis的整合。Redis是一种高性能的内存数据库,常用于缓存、消息队列和分布式会话等场景。通过将Redis与SpringBoot2整合,我们可以更方便地使用Redis提供的各种功能。整合步骤下表......
  • springboot redis 缓存数据
    SpringBootRedis缓存数据实现教程一、整体流程下面是实现SpringBootRedis缓存数据的整体流程:步骤操作1引入Redis依赖2配置Redis连接信息3创建缓存注解4使用缓存注解接下来,我将逐步介绍每个步骤需要做的事情,包括需要使用的代码以及代码的注释。二......
  • spring-boot-starter-data-redis数据压缩
    SpringBootStarterDataRedis数据压缩在使用SpringBoot开发应用时,经常需要使用Redis来进行数据存储和缓存操作。为了提高性能和减少网络传输开销,我们可以对Redis中存储的数据进行压缩。什么是数据压缩数据压缩是一种将数据通过某种算法进行处理,以减小数据占用空间的方法。......
  • vue redis
    实现VueRedis简介在开始讲解实现"VueRedis"之前,我们先来了解一下Redis是什么。Redis(RemoteDictionaryServer)是一个开源的内存数据结构存储系统,它常用于高性能的存储和数据缓存。Vue.js是一个用于构建用户界面的渐进式JavaScript框架。而"VueRedis"的目标是将Redis与Vue.js......
  • 7.25 day2数据结构优化dp
    战绩:100+100+20+54=374T1据lxl说是为了成绩好看加的题,难度大概cspjT1T2朴素dp然后树状数组优化一下T3赛时脑抽链,写了个dp,一直想优化dp,其实贪心就好了,过程更加简洁,优化很显然先将区间剖分成两段端点\(s_i=s_j\)相同的多条线段将区间每个点吸附到离他右边最近的一个线段......
  • Redis操作类
    usingCSRedis.Internal.ObjectPool;usingSystem;usingSystem.Collections.Concurrent;usingSystem.Collections.Generic;usingSystem.Diagnostics;usingSystem.Linq;usingSystem.Text.RegularExpressions;usingSystem.Threading;usingSystem.Threading.Tasks......
  • 如何设计灵活的函数接口
     仅作为笔记使用 设计灵活的函数接口可以提高函数的可重用性和扩展性,使其更易于在不同的上下文中使用。以下是一些设计灵活函数接口的方法:1.使用参数对象:将相关的参数封装到一个参数对象中,而不是使用多个单独的参数。这样可以简化函数的参数列表,并且当需要添加新的参数时,......