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();
for (Map.Entry<String, String> item : source.entrySet()) {
// hset zset都是可以用的,但是要序列化
connection.set(RedisSerializer.string().serialize(item.getKey()),
RedisSerializer.string().serialize(item.getValue()));
// 设置过期时间 10天
connection.expire(RedisSerializer.string().serialize(item.getKey()), TimeUnit.DAYS.toSeconds(10));
}
connection.close();
// executePipelined源码要求RedisCallback必须返回null,否则抛异常
return null;
});
}
}
- 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
1. 批量更新插入 jdbcTemplate.batchUpdate(String sql, List<Object[]> batchArgs) Object[]数组的长度为每条记录的参数 ...
- spring jdbc批量插入
http://blog.csdn.net/fyqcdbdx/article/details/7366439
- Spring利用JDBCTemplate实现批量插入和返回id
1.先介绍一下java.sql.Connection接口提供的三个在执行插入语句后可取的自动生成的主键的方法: //第一个是 PreparedStatement prepareStatement(St ...
- spring data jpa开启批量插入、批量更新
spring data jpa开启批量插入.批量更新 原文链接:https://www.cnblogs.com/blog5277/p/10661096.html 原文作者:博客园--曲高终和寡 *** ...
- (通用Mapper、分页,批量插入,一分钟接入)spring mvc+mybatis+maven集成tkmapper+pagehelper
<!-- maven tkmapper引入--> <dependency> <groupId>tk.mybatis</groupId> <arti ...
- 【JDBC】使用Spring提供的JDBCTemplate通过Statement向MySql数据库插入千万条数据,耗时4m55s,使用insert语句批量插入方式二
这回依然是使用 insert批量插入这种方式 insert into emp(name,age,cdate) values ('A' , 20, '2019-10-13 00:00:00'), ('B ...
- mybatis批量插入返回主键问题
今天整合mybatis时候用到返回主键问题,批量插入总是返回不了主键还报错. 记录入下: pom版本: <mybatis.version>3.2.6</mybatis.version ...
- 批量插入数据(基于Mybatis的实现-Oracle)
前言:做一个数据同步项目,要求:同步数据不丢失的情况下,提高插入性能. 项目DB框架:Mybatis.DataBase:Oracle. -------------------------------- ...
- mybatis批量插入数据到oracle
mybatis 批量插入数据到oracle报 ”java.sql.SQLException: ORA-00933: SQL 命令未正确结束“ 错误解决方法 oracle批量插入使用 insert a ...
随机推荐
- LCA与树上DP
LCA 倍增 f[i][j]代表i的2^j级父亲 f[i][j]=f[f[i][j-1]][j-1] 有了f数组,如何计算"u向上跳k步到达哪个点"? 对k作二进制分解,枚举所有二 ...
- 《PHP程序员面试笔试宝典》——什么是职场暗语?
本文摘自<PHP程序员面试笔试宝典> 文末有该书电子版下载. 随着求职大势的变迁发展,以往常规的面试套路因为过于单调.简明,已经被众多"面试达人"们挖掘出了各种&quo ...
- splunk设置索引周期和索引大小
步骤一: 编辑/opt/splunk/etc/apps/search/local/indexs.conf ,在每个索引下面 加入最后两行内容 [messages] coldPath = $SPLUNK ...
- python-利用shutil模块rmtree方法可以将文件及其文件夹下的内容删除
import shutil import os image_path = os.path.join(os.path.dirname(__file__),'image') # 如果存在image目录则删 ...
- PentestBox在win10里打不开工具 显示无系统命令的解决方法
PentestBox详细安装过程:http://www.cnblogs.com/ESHLkangi/p/8336398.html 在使用PentestBox的时候出现了打不开工具的问题,最后看到一个大 ...
- MLD协议测试——网络测试仪实操
一.简介 1. MLD简介 MLD · Multicast Listener Discovery Protocol · 组播侦听者发现协议 功能 · 在终端主机和与其直接相邻的组播路由器之间建立/维护 ...
- BI开创者Tableau“出走中国”,中国BI用户该何去何从?
11月,Tableau在发给客户的邮件中透露将停止中国的直销业务,加入阿里的合作体系.消息来的如此突然,Tableau的同仁.合作伙伴.客户.用户.爱好者,甚至友商,无一不感到震惊和担忧. 在我们数据 ...
- 【C#操作符】typeof 和 is 运算符执行的类型检查之间的差异
typeof 运算符也能用于公开的泛型类型.具有不止一个类型参数的类型的规范中必须有适当数量的逗号.不能重载 typeof 运算符. is 可以检测和父类是否兼容,typeof责不能 public c ...
- Shell脚本编写登陆小程序.sh
转至:https://www.cnblogs.com/gaohongyu/articles/12072594.html #!/bin/bash #Author:GaoHongYu #QQ:106176 ...
- 8.StringTable(字符串常量池)
一.String的基本特性 String:字符串,使用一对 "" 引起来表示 String s1 = "atguigu" ; // 字面量的定义方式 Strin ...