欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring data redis 使用 pipelined 批量操作

程序员文章站 2022-06-02 19:53:56
...

需求说明

当用到数据的时候,将项目中数据放到redis中,这些数据预计会达到十几万。

方案一

// 这样最简单
list.forEach(s -> redisTemplate.opsForSet().add("key", s));

如上代码很简单,遍历集合放入redis,但是这样效率低,每次都要获取一次连接,十几万的连接,大部分时间都在创建销毁连接了,真正执行任务的时间相对来说要少很多。
Spring data redis 使用 pipelined 批量操作
看上面进来执行任务的时候要先获取一次连接,finally里面释放了(如果你使用了事务那么就不会重新获取连接,不过这不是本文要讲的,如果想了解自己可以看看。)所以方案一要优化。

方案二

RedisSerializer keyS = redisTemplate.getKeySerializer();
RedisSerializer valueS = redisTemplate.getValueSerializer();
byte[] key = keyS.serialize("key");

redisTemplate.executePipelined((RedisCallback<String>) connection -> {
    list.stream().forEach(s -> connection.sAdd(key, valueS.serialize(s)));
    // 设置过期时间
    connection.expire(key, 60L);
    return null;
});

redis提供了批量操作方式执行命令,就是pipeline。使用方式如上,方法内所有命令都是在一个连接内。这样就完美解决了我们的问题。