前言
今天在優化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 可以支持事務