目录

一、通过Pipeline(管道)批量插入

二、使用multiSet批量插入

三、效率测试

四、小结


工作中常会遇到连续多次向Redis插入数据的场景,这时候要是使用for循环一条条的插入,效率低下不说,还显得low,不符合我们的B格,这时候就可以用到本文中所说的方法了

一、通过Pipeline(管道)批量插入

使用redisTemplate.executePipelined重写RedisCallbackdoInRedis方法

RedisSerializer<String> serializer = redisTemplate.getStringSerializer();redisTemplate.executePipelined(new RedisCallback<Object>() {@Overridepublic Object doInRedis(RedisConnection redisConnection) throws DataAccessException {map.forEach((key,value) -> {redisConnection.set(serializer.serialize("pipeline"+key),serializer.serialize(String.valueOf(value)),Expiration.seconds(600), RedisStringCommands.SetOption.UPSERT);});return null;}},serializer);

为什么在doInRedis方法中返回null呢?我们点进去executePipelined()方法的源码中可看到,若不为null就抛出异常

Object result = action.doInRedis(connection);
if (result != null) {throw new InvalidDataAccessApiUsageException("Callback cannot return a non-null value as             it gets overwritten by the pipeline");
}

二、使用multiSet批量插入

  效率最高,缺点是不能设置过期时间

redisTemplate.opsForValue().multiSet(map);

三、效率测试

本文使用三种方法插入五万条数据进行对比测试

@RestController
@RequestMapping("/testRedis")
@Slf4j
public class TestRedisController {@Resourceprivate RedisTemplate<String ,Object> redisTemplate;private static Map<String, Object> map = new HashMap<>();@PostConstructpublic void initMap(){for (int i = 0; i < 50000; i++) {map.put(i+"",i);}log.info("Map数据初始化完成,现有:{}",map.size());}@GetMapping("/testBatchInsert")@ApiOperation("批量插入")public ResultVO<Object> testBatchInsert(){// 常规循环插入long s2 = System.currentTimeMillis();map.forEach((key,value)->{redisTemplate.opsForValue().set("common"+key,value,10, TimeUnit.MINUTES);});long e2 = System.currentTimeMillis();log.info("常规循环插入耗时:{}",e2-s2);// 管道插入long start = System.currentTimeMillis();RedisSerializer<String> serializer = redisTemplate.getStringSerializer();redisTemplate.executePipelined(new RedisCallback<Object>() {@Overridepublic Object doInRedis(RedisConnection redisConnection) throws DataAccessException {map.forEach((key,value) -> {redisConnection.set(serializer.serialize("pipeline"+key),serializer.serialize(String.valueOf(value)),Expiration.seconds(600), RedisStringCommands.SetOption.UPSERT);});return null;}},serializer);long end = System.currentTimeMillis();log.info("管道批量插入耗时:{}",end-start);// 批量插入long s3 = System.currentTimeMillis();redisTemplate.opsForValue().multiSet(map);long e3 = System.currentTimeMillis();log.info("批量插入耗时:{}",e3-s3);return ResultUtils.success();}}

执行两次结果如下:

四、小结

从测试结果可看出,使用multiSet()方式速度最快,管道次之,循环最慢;但multiSet最致命的就是无法设置过期时间,如果业务允许的话使用此方式最好;要根据实际的业务场景来选择使用哪种方式

欢迎大家指正错误,转载请注明出处!

RedisTemplet批量插入数据相关推荐

  1. 批量插入数据库语句java_java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)...

    java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码) 发布于 2020-7-22| 复制链接 本文通过实例代码给大家分享了MyBatis批量插入数据到Oracle数据库 ...

  2. oracle insert汉字出错,Oracle数据库之Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名...

    本文主要向大家介绍了Oracle数据库之Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. Oracle数据库,用 ...

  3. linux批量es数据,Elasticsearch批量插入数据

    Elasticsearch批量插入数据 使用bulk批量操作数据库 1. 创建批量操作文件 格式: {"index":{"_index":"home& ...

  4. android SQLite 批量插入数据慢的解决方案 (针对于不同的android api 版本)

    android SQLite 批量插入数据慢的解决方案 (针对于不同的android api 版本) 参考文章: (1)android SQLite 批量插入数据慢的解决方案 (针对于不同的andro ...

  5. php addall,ThinkPHP3.2框架使用addAll()批量插入数据的方法

    这篇文章主要介绍了ThinkPHP3.2框架使用addAll()批量插入数据的方法,结合实例形式分析了thinkPHP针对单条数据插入及批量数据插入操作的相关实现技巧,需要的朋友可以参考下 本文实例讲 ...

  6. .NET Excel 2003 批量插入数据很慢的解决办法

    .Net利用Office组件的操作Excel批量插入数据据的时候,会非常慢. 我也曾经想利用其它组件来实现这个功能,但是效果不是很理想.后来经过查阅资料,发现Excel.Range的Value属性是O ...

  7. bulk_create 批量插入数据

    def booklist(request):# 动态插入100条数据for i in range(100):models.Book2.objects.create(name='第%s本书'%i)#批量 ...

  8. shell批量插入数据

    用shell脚本批量插入数据,很简单.直接看代码: #! /bin/bashhost="xxx" port="xxx" userName="xxx&q ...

  9. MySQL批量插入数据的几种方法

    最近公司要求测试数据库的性能,就上网查了一些批量插入数据的代码,发现有好几种不同的用法,插入同样数据的耗时也有区别 别的先不说,先上一段代码与君共享 方法一: package com.bigdata; ...

最新文章

  1. 上手!深度学习最常见的26个模型练习项目汇总
  2. 从Atlas到Microsoft ASP.NET AJAX(4) - Browser Compatibility
  3. lastpass安卓最新版_LastPass
  4. VTK:图片之ImageNonMaximumSuppression
  5. android sqlite查询某个字段,Android的sqlite:如何检索特定列的特定数据?
  6. python对abaqus本构二次开发_基于Python的Abaqus二次开发实例讲解
  7. torch.Tensor.scatter_(dim, index, src, reduce=None)
  8. wps流程图数量如何修改_免费WPS会员领取渠道!(不要转发)
  9. java hibernate状态_Hibernate对象的三种状态
  10. Spring源码之ApplicationContext(四)功能补充
  11. 无线路由器pppoe服务器,详解Volans飞鱼星路由器怎么设置PPPOE服务器
  12. android studio 或者 idea 前进 后退 箭头图标添加到 工具栏
  13. 软件设计之UML—UML的构成[上]
  14. php生成表格数据类型,phpspreadsheet 中文文档(四) 创建电子表格+档案格式
  15. 基于python的国内外研究现状怎么写_国内外研究现状的写法
  16. 当今中华之教育改革势在必行矣!
  17. 国考面试计算机专业知识,2016年国家公务员面试银监会-计算机专业之网络基本知识(3)...
  18. 全志 V85x E907 RISC-V小核开发与使用
  19. nlp中文本相似度匹配
  20. 【渝粤教育】电大中专计算机职业素养 (13)作业 题库

热门文章

  1. Scratch(五十四):教师节快乐
  2. 同花顺_代码解析_技术指标_M
  3. 随机过程及应用(二) - E[X|Y] = E[Y E[X|Y]]证明
  4. 【志强课堂】聊一聊互联网项目怎么做!
  5. 投资方和研发团队的那些事[转]
  6. Java字符串拼接写法 joiner.on
  7. 手机相机专业模式介绍
  8. 虚拟机Linux下Oracle11g客户端安装
  9. Mac软件推荐:NoMachine轻松带你远程控制桌面
  10. C#实现一元二次函数求解(实根+虚根)含源码