Java对Redis的批量操作 - RedisTemplate

一、背景

  • 需求:一次性获取redis缓存中多个key的value
  • 潜在隐患:循环key,获取value,可能会造成连接池的连接数增多,连接的创建和摧毁,消耗性能
  • 解决方法:根据项目中的缓存数据结构的实际情况,数据结构为string类型的,使用RedisTemplate的multiGet方法;数据结构为hash,使用Pipeline(管道),组合命令,批量操作redis。

二、操作

  1. RedisTemplate的multiGet的操作

    • 针对数据结构为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)方式一 : 基础方式

    • 使用类: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数据结构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()); // 自定义序列化
      

三、说明
本文简单的举了关于RedisTemplate的两个例子,但大家千万别以为只是批量取值的时候会用到,PipeLine其实是用来批量发送命令操作Redis。后来用Jedis也进行了实现,见下会分解。

如有不正确的地方,请大家指点

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,197评论 19赞 139
  • 听到妈妈告诉我,要带我出去,就高兴得跳了起来。第一次去这么远的地方旅游,心里是各种兴奋,激动!临出发前各种试衣服,...
    小米LiPei阅读 356评论 0赞 0
  • 今天的作业跟很早就写完了,我们一起学习了新单元分数的意义,由于上次去听了一节课,发现预习的重要性,就特意和...
    秋天_400e阅读 534评论 0赞 4
  • 一个月的时间,断断续续地读完了克莱尔 麦克福尔的摆渡人,给我的感觉就是一个情节简单的很好的故事,有点国外版的...
    丁俊山阅读 426评论 0赞 0
  • 小城 春 带着小雨 趁一幕夜色 偷偷芳香了嫩叶 一首老歌 一把雨伞 思绪远在楼外楼 ...
    龙吟楚邦阅读 233评论 0赞 0

友情链接更多精彩内容