Spring RedisTemplate批量插入

Posted ColdSmog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring RedisTemplate批量插入相关的知识,希望对你有一定的参考价值。

1. 循环请求

最容易想到也是最耗时的操作,不推荐使用。简单样例如下

@Service
public class RedisService 
    @Resource
    private RedisTemplate<String,Object> template;

    public void multiSave(Map<String,String> source) 
        for(Map.Entry<String,String> item : source.entrySet()) 
            template.opsForValue().set(item.getKey(), item.getValue());
        
    

2. pipe请求

流水线操作,其实就是一次性请求把所有命令发过去,不再等待他的返回,节省的是http请求时间。
需要注意的是必须要自己序列化,我此处使用RedisSerializer.string()始终是一个对象,但是如果json序列对象RedisSerializer.json()每次都是新对象,这个就建议自己声明一个变量保存
下面的样例为求优雅,用的是jdk8的一些语法和对象,如果读者的jdk<8, 可以找找其他网上不那么优雅的版本

@Service
public class RedisService 
    @Resource
    private RedisTemplate<String, Object> template;

    public void multiSave(Map<String, String> source) 
        template.executePipelined((RedisCallback<Object>) connection -> 
            // 这里逻辑简单不会抛异常
            // 否则需要加上try...catch...finally防止链接未正常关闭 造成泄漏
            connection.openPipeline();
            source.forEach((key, value) -> 
                // hset zset都是可以用的,但是要序列化
                connection.set(RedisSerializer.string().serialize(key),
                        RedisSerializer.string().serialize(value));
                // 设置过期时间 10天
                connection.expire(RedisSerializer.string().serialize(key), TimeUnit.DAYS.toSeconds(10));
            );
            connection.close();
            // executePipelined源码要求RedisCallback必须返回null,否则抛异常
            return null;
        );
    

  1. multiSet
    原生支持的批量操作,速度最快。
    但是不灵活,使用范围较有限。比如hset支持一次多个插入,但是opsForHash()就没有multiSet,只有multiGet
    也没有一起设置过期时间,仔细衡量业务场景后使用
@Service
public class RedisService 
   @Resource
   private RedisTemplate<String,Object> template;
   
   public void multiSave(Map<String,String> source) 
       template.opsForValue().multiSet(source);
   

4. 总结对比

这里就用别人的测试结果吧,公司内网开发,上面代码都是手打;若有错漏请不吝指教

10万次插入的情况下

普通set消耗9010毫秒
管道set消耗1606毫秒
批量set消耗18毫秒

性能测试来源:https://blog.csdn.net/weixin_41677422/article/details/108626587

以上是关于Spring RedisTemplate批量插入的主要内容,如果未能解决你的问题,请参考以下文章

spring JdbcTemplate批量插入以及单个插入时获取id

redis 批量删除键

180611-Spring之RedisTemplate配置与使用

使用 Hibernate 和 Spring 进行批量插入

Spring-data-jpa:批量插入不起作用

HIbernate 批量插入或更新在 Spring Boot 中不起作用