Redis循环慢接口优化
原慢接口
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;
原因分析
当keys 数据过大,
RTT时间会变大。
多个Redis命令之间会有往返时间消耗。

使用MGET、Pipelined可以减少
RTT时间首次进入此代码域,由于缓存为空,全部走数据库,也会导致接口变慢。
解决方式
Pipelined、MGET 能批量获取数据,但注意元素个数
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;
Redis循环慢接口优化的更多相关文章
- 单一接口优化过程全记录(主要涉及Redis)
接口优化过程记录 问题背景 某个接口耗时长(247ms),但里面逻辑不算复杂,只进行了简单的对象引用以及操作了多次Redis 步骤1:链路追踪,确定业务耗时点 接口里通过链路追踪以及日志查询发现主要是 ...
- Redis数据导入工具优化过程总结
Redis数据导入工具优化过程总结 背景 使用C++开发了一个Redis数据导入工具 从oracle中将所有表数据导入到redis中: 不是单纯的数据导入,每条oracle中的原有记录,需要经过业务逻 ...
- 使用Nginx Lua实现redis高性能http接口
使用Nginx Lua实现redis高性能http接口 时间 -- :: 峰云就她了 原文 http://xiaorui.cc/2015/01/27/使用nginx-lua实现redis高性能http ...
- 【redis】redis实现API接口调用调用次数的限制
redis实现API接口调用调用次数的限制 参考地址:https://bbs.csdn.net/topics/391856106?page=1 参考地址:https://www.cnblogs.com ...
- ASP.NET Core WebApi基于Redis实现Token接口安全认证
一.课程介绍 明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NET WebSer ...
- for循环实战性能优化之使用Map集合优化
笔者在<for循环实战性能优化>中提出了五种提升for循环性能的优化策略,这次我们在其中嵌套循环优化小循环驱动大循环的基础上,借助Map集合高效的查询性能来优化嵌套for循环 ...
- for循环实战性能优化
完成同样的功能,用不同的代码来实现,性能上可能会有比较大的差别,所以对于一些性能敏感的模块来说,对代码进行一定的优化还是很有必要的.今天就来说一下java代码优化的事情,今天主要聊一下对于for(wh ...
- Redis从出门到高可用--Redis复制原理与优化
Redis从出门到高可用–Redis复制原理与优化 单机有什么问题? 1.单机故障; 2.单机容量有瓶颈 3.单机有QPS瓶颈 主从复制:主机数据更新后根据配置和策略,自动同步到备机的master/s ...
- java关于for循环的效率优化
我们知道在实现一个功能的时候是可以使用不同的代码来实现的,那么相应的不同实现方法的性能肯定也是有差别的,所以我们在写一些对性能很敏感的模块的时候,对代码进行优化是很必要的,所以我们说一下for循环(w ...
- 移动端API接口优化的术和结果
最近一直在忙工作的事情,所以文章写得有些少. 有3-5篇文章都是写到一半然后被别的事情给打断了,所以,我得找个时间好好补补. 最近一直在关注移动端接口API的可用性问题,在移动时代这个做这个优化能产生 ...
随机推荐
- Mongodb入门4
今天学习一下MongoDB数据库的索引. 因为养的鱼生病了,所以抽空晚上学习记录一下. 这里借用一下菜鸟教程的原文: 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描 ...
- JavaScript习题之简答题
1.分别描述HTML.CSS.JS在页面组成中的作用.HTML是超文本标记语言,是用来描述网页的语言,定义网页的结构,内容可以包含文字.图片.视频等. CSS是层叠样式表,定义如何显示HTML元素,比 ...
- 一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
前言 最近有不少小伙伴在问:.NET有什么值得推荐的网络通信框架?今天大姚给大家分享一个.NET开源.免费(MIT License).快速.低延迟的异步套接字服务器和客户端库:NetCoreServe ...
- go 实现sse
package chat import ( "encoding/json" "github.com/zeromicro/go-zero/core/logx" & ...
- CSharp的lambda表达式的使用
using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using Syst ...
- 复用对评论和对文章回复的弹层 popup- vant2
基本样式: ps:当message 即输入的内容的长度为 0 的时候,按钮禁止使用 : <template> <div class="comment-post"& ...
- HarmonyOS NEXT开发之ArkTS自定义组件学习笔记
在HarmonyOS中,ArkTS提供了创建自定义组件的能力,允许开发者封装和复用UI代码.以下是关于自定义组件的详细介绍,包括创建自定义组件.页面和自定义组件的生命周期.自定义组件的自定义布局.冻结 ...
- 这十年我与广告不共戴天练就的十八般武艺 #PC去广告 #手机去广告
背景 大家应该都体会过广告的苦恼,比如看着好看的电视,突然给播放广告,这时候痛苦系数飙升.随着社会进步,广告的载体,还有形式也越来越多,比如手机端各种APP启动广告,PC端软件弹窗,网站Banner等 ...
- 最新Sql语句来啦
创建数据库 CREATE DATABASE 数据库名称; 删除数据库 DROP DATABASE 数据库名称; 创建新表 create table 表名(列 类型 ,列 类型 ,..); 根据已有的表 ...
- error loading sources list: ('The read operation timed out',)解决办法!!
一.灵魂四问 1.为什么叫rosdepc? rosdepc,c指的是China中国,主要用于和rosdep区分. 2.rosdepc和rosdep功能一致吗? rosdep官方最新版源码直接修改的,小 ...