RedisTemplet批量插入数据
目录
一、通过Pipeline(管道)批量插入
二、使用multiSet批量插入
三、效率测试
四、小结
工作中常会遇到连续多次向Redis插入数据的场景,这时候要是使用for循环一条条的插入,效率低下不说,还显得low,不符合我们的B格,这时候就可以用到本文中所说的方法了
一、通过Pipeline(管道)批量插入
使用redisTemplate.executePipelined重写RedisCallback的doInRedis方法
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批量插入数据相关推荐
- 批量插入数据库语句java_java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)...
java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码) 发布于 2020-7-22| 复制链接 本文通过实例代码给大家分享了MyBatis批量插入数据到Oracle数据库 ...
- oracle insert汉字出错,Oracle数据库之Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名...
本文主要向大家介绍了Oracle数据库之Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. Oracle数据库,用 ...
- linux批量es数据,Elasticsearch批量插入数据
Elasticsearch批量插入数据 使用bulk批量操作数据库 1. 创建批量操作文件 格式: {"index":{"_index":"home& ...
- android SQLite 批量插入数据慢的解决方案 (针对于不同的android api 版本)
android SQLite 批量插入数据慢的解决方案 (针对于不同的android api 版本) 参考文章: (1)android SQLite 批量插入数据慢的解决方案 (针对于不同的andro ...
- php addall,ThinkPHP3.2框架使用addAll()批量插入数据的方法
这篇文章主要介绍了ThinkPHP3.2框架使用addAll()批量插入数据的方法,结合实例形式分析了thinkPHP针对单条数据插入及批量数据插入操作的相关实现技巧,需要的朋友可以参考下 本文实例讲 ...
- .NET Excel 2003 批量插入数据很慢的解决办法
.Net利用Office组件的操作Excel批量插入数据据的时候,会非常慢. 我也曾经想利用其它组件来实现这个功能,但是效果不是很理想.后来经过查阅资料,发现Excel.Range的Value属性是O ...
- bulk_create 批量插入数据
def booklist(request):# 动态插入100条数据for i in range(100):models.Book2.objects.create(name='第%s本书'%i)#批量 ...
- shell批量插入数据
用shell脚本批量插入数据,很简单.直接看代码: #! /bin/bashhost="xxx" port="xxx" userName="xxx&q ...
- MySQL批量插入数据的几种方法
最近公司要求测试数据库的性能,就上网查了一些批量插入数据的代码,发现有好几种不同的用法,插入同样数据的耗时也有区别 别的先不说,先上一段代码与君共享 方法一: package com.bigdata; ...
最新文章
- 上手!深度学习最常见的26个模型练习项目汇总
- 从Atlas到Microsoft ASP.NET AJAX(4) - Browser Compatibility
- lastpass安卓最新版_LastPass
- VTK:图片之ImageNonMaximumSuppression
- android sqlite查询某个字段,Android的sqlite:如何检索特定列的特定数据?
- python对abaqus本构二次开发_基于Python的Abaqus二次开发实例讲解
- torch.Tensor.scatter_(dim, index, src, reduce=None)
- wps流程图数量如何修改_免费WPS会员领取渠道!(不要转发)
- java hibernate状态_Hibernate对象的三种状态
- Spring源码之ApplicationContext(四)功能补充
- 无线路由器pppoe服务器,详解Volans飞鱼星路由器怎么设置PPPOE服务器
- android studio 或者 idea 前进 后退 箭头图标添加到 工具栏
- 软件设计之UML—UML的构成[上]
- php生成表格数据类型,phpspreadsheet 中文文档(四) 创建电子表格+档案格式
- 基于python的国内外研究现状怎么写_国内外研究现状的写法
- 当今中华之教育改革势在必行矣!
- 国考面试计算机专业知识,2016年国家公务员面试银监会-计算机专业之网络基本知识(3)...
- 全志 V85x E907 RISC-V小核开发与使用
- nlp中文本相似度匹配
- 【渝粤教育】电大中专计算机职业素养 (13)作业 题库
热门文章
- Scratch(五十四):教师节快乐
- 同花顺_代码解析_技术指标_M
- 随机过程及应用(二) - E[X|Y] = E[Y E[X|Y]]证明
- 【志强课堂】聊一聊互联网项目怎么做!
- 投资方和研发团队的那些事[转]
- Java字符串拼接写法 joiner.on
- 手机相机专业模式介绍
- 虚拟机Linux下Oracle11g客户端安装
- Mac软件推荐:NoMachine轻松带你远程控制桌面
- C#实现一元二次函数求解(实根+虚根)含源码