Redis Pipeline
前言
今天在优化Feed流时发现服务重启后,初始化数据保存数据到Redis时异常慢,原来之前用的是单个set命令去做的,早就听闻Pipeline是redis批量操作的利器,正好这次用Pipeline进行优化;
整合Redis实战
一、原理分析
1、单个命令操作
2、Pipeline批量操作
二、测试代码
@Overrider
private RedisTemplate strRedisTemplate;
//单个新增操作
@RequestMapping(value = "/set/single", method = RequestMethod.GET)
public void setSingle() {
for (int i = 0; i < 100; i++) {
strRedisTemplate.opsForValue().set("single:" + i, "123");
}
}
//批量新增操作
@RequestMapping(value = "/set/pipeline", method = RequestMethod.GET)
public void setPipeline() {
strRedisTemplate.executePipelined(new RedisCallback<String>() {
@Override
public String doInRedis(RedisConnection connection) throws DataAccessException {
for (int i = 0; i < 100; i++) {
connection.set(("pipel:" + i).getBytes(), "123".getBytes());
}
return null;
}
});
}
//单个读取操作
@RequestMapping(value = "/get/single", method = RequestMethod.GET)
public void addSingle() {
for (int i = 0; i < 100; i++) {
strRedisTemplate.opsForValue().get("single:" + i);
}
}
//批量读取操作
@RequestMapping(value = "/get/pipeline", method = RequestMethod.GET)
public void getPipeline() {
List<String> list = strRedisTemplate.executePipelined(new RedisCallback<String>() {
@Override
public String doInRedis(RedisConnection connection) throws DataAccessException {
for (int i = 0; i < 100; i++) {
connection.get(("pipel:" + i).getBytes());
}
return null;
}
});
}
以上代码不管set还是get 都需要return null。 另外批量读取时,返回的List,如果 connection.get 在Redis不存在,则List中会有null值存在。 需要自己去过滤null值。
RedisCallback 和SessionCallback区别
SessionCallback & RedisCallback 的作用都是:让RedisTemplate进行回调,通过它们可以在同一条连接下执行多个Redis命令。SessionCalback提供了良好的封装,优先使用它,RedisCallback稍微复杂一些。
区别:
SessionCallback 可以支持事务
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)