Java對(duì)Redis的批量操作 - RedisTemplate

一、背景

  • 需求:一次性獲取redis緩存中多個(gè)key的value
  • 潛在隱患:循環(huán)key,獲取value,可能會(huì)造成連接池的連接數(shù)增多,連接的創(chuàng)建和摧毀,消耗性能
  • 解決方法:根據(jù)項(xiàng)目中的緩存數(shù)據(jù)結(jié)構(gòu)的實(shí)際情況,數(shù)據(jù)結(jié)構(gòu)為string類型的,使用RedisTemplate的multiGet方法;數(shù)據(jù)結(jié)構(gòu)為hash,使用Pipeline(管道),組合命令,批量操作redis。

二、操作

  1. RedisTemplate的multiGet的操作

    • 針對(duì)數(shù)據(jù)結(jié)構(gòu)為String類型

    • 示例代碼

      List<String> keys = new ArrayList<>();
      for (Book e : booklist) {
         String key = generateKey.getKey(e);
         keys.add(key);
      }
      List<Serializable> resultStr = template.opsForValue().multiGet(keys);
      

      此方法還是比較好用,使用者注意封裝。

  2. RedisTemplate的Pipeline使用

    1)方式一 : 基礎(chǔ)方式

    • 使用類:StringRedisTemplate

    • 使用方法

      public executePipelined(RedisCallback<?> action) {...}
      
    • 示例代碼:批量獲取value

      List<Object> redisResult = redisTemplate.executePipelined(new RedisCallback<String>() {
         @Override
          public String doInRedis(RedisConnection redisConnection) throws DataAccessException {  
              for (BooK e : booklist) {
             StringRedisConnection stringRedisConnection =(StringRedisConnection)redisConnection;
              stringRedisConnection.get(e.getId());
              }
             return null;
          }
      });
      
    1. 方法二 : 使用自定義序列化方法
    • 使用類:RedisTemplate

    • 使用方法

      public List<Object> executePipelined(final RedisCallback<?> action, final RedisSerializer<?> resultSerializer) {...}
      
    • 示例代碼:批量獲取hash數(shù)據(jù)結(jié)構(gòu)value

      List<Object> redisResult = redisTemplate.executePipelined(
        new RedisCallback<String>() {
          // 自定義序列化
          RedisSerializer keyS = redisTemplate.getKeySerializer();
          @Override
          public String doInRedis(RedisConnection redisConnection) throws DataAccessException {
              for (BooK e : booklist) {
                    redisConnection.hGet(keyS.serialize(e.getName()), keyS.serialize(e.getAuthor()));
              }
              return null;
          }
        }, redisTemplate.getValueSerializer()); // 自定義序列化
      

三、說明
本文簡(jiǎn)單的舉了關(guān)于RedisTemplate的兩個(gè)例子,但大家千萬別以為只是批量取值的時(shí)候會(huì)用到,PipeLine其實(shí)是用來批量發(fā)送命令操作Redis。后來用Jedis也進(jìn)行了實(shí)現(xiàn),見下會(huì)分解。

如有不正確的地方,請(qǐng)大家指點(diǎn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,711評(píng)論 19 139
  • 聽到媽媽告訴我,要帶我出去,就高興得跳了起來。第一次去這么遠(yuǎn)的地方旅游,心里是各種興奮,激動(dòng)!臨出發(fā)前各種試衣服,...
    小米LiPei閱讀 331評(píng)論 0 0
  • 今天的作業(yè)跟很早就寫完了,我們一起學(xué)習(xí)了新單元分?jǐn)?shù)的意義,由于上次去聽了一節(jié)課,發(fā)現(xiàn)預(yù)習(xí)的重要性,就特意和...
    秋天_400e閱讀 503評(píng)論 0 4
  • 一個(gè)月的時(shí)間,斷斷續(xù)續(xù)地讀完了克萊爾 麥克福爾的擺渡人,給我的感覺就是一個(gè)情節(jié)簡(jiǎn)單的很好的故事,有點(diǎn)國(guó)外版的...
    丁俊山閱讀 407評(píng)論 0 0
  • 小城 春 帶著小雨 趁一幕夜色 偷偷芳香了嫩葉 一首老歌 一把雨傘 思緒遠(yuǎn)在樓外樓 ...
    龍吟楚邦閱讀 219評(píng)論 0 0

友情鏈接更多精彩內(nèi)容