前言
今天在優化Feed流時發現服務重啟后,初始化資料保存資料到Redis時例外慢,原來之前用的是單個set命令去做的,早就聽聞Pipeline是redis批量操作的利器,正好這次用Pipeline進行優化;
整合Redis實戰
一、原理分析
1、單個命令操作

2、Pipeline批量操作

二、測驗代碼
@Overrider
private RedisTemplate strRedisTemplate;
//單個新增操作
@RequestMapping(value = "https://www.cnblogs.com/set/single", method = RequestMethod.GET)
public void setSingle() {
for (int i = 0; i < 100; i++) {
strRedisTemplate.opsForValue().set("single:" + i, "123");
}
}
//批量新增操作
@RequestMapping(value = "https://www.cnblogs.com/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 = "https://www.cnblogs.com/get/single", method = RequestMethod.GET)
public void addSingle() {
for (int i = 0; i < 100; i++) {
strRedisTemplate.opsForValue().get("single:" + i);
}
}
//批量讀取操作
@RequestMapping(value = "https://www.cnblogs.com/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 可以支持事務
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/447163.html
標籤:其他
下一篇:如何關閉/禁用金屬深度測驗
