java陣列---特點,邊界
阿新 • • 發佈:2022-03-19
前言
今天在優化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 可以支援事務