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 ...
随机推荐
- Linux 打包压缩、软链接、硬链接、配置镜像源
tar命令:tar -cvf 打包文件.tar 被打包文件的路径 把文件打包成tar包,但并未被压缩: [root@Server-n93yom test]# ll total 0 -rw-r-- ...
- Linux Shell脚本攻略复习
1. 打开终端后的提示符中,$表示普通用户,#表示管理员用户root,root是linux系统中权限最高的用户. 2. shell脚本通常是一个#!起始的文本文件,其中#!位于解释器路径之前. 例如: ...
- Scala概述及环境配置
一.概述 1.1 为什么要学Scala? Spark是新一代的内存级大数据的计算框架,是大数据学习的重要内容.随着Spark的兴起,同时也带动了Scala的学习,因为Spark就是Scala编写的.为 ...
- fiddler模拟2
在解决日常的支持需求中,经常会遇到一些用户反馈一些无法简单复现的bug,有很大一部分的bug是由于用户自身的网络环境波动,或者是本身网络环境就较为恶劣,而服务在面对这种恶劣的网络环境的健壮性不够,导致 ...
- Vue 组件库:Element
目录 Element 介绍 什么是 Element ? Element 快速入门 Element 常用组件 基础布局 容器布局 表单组件 表格组件 顶部导航栏组件 侧边导航栏组件 Element 介绍 ...
- 框架02--Iptables实际应用
目录 Iptables实际应用 一.安装iptables 1. 安装iptables软件包 2. 命令格式 3. 参数 二.iptables动作 三.Iptables基本的条件匹配(协议) 四.-s ...
- 第三章 in,not in 的理解,limit限制结果集
IN 运算符用来判断表达式的值是否位于给出的列表中:如果是,返回值为 1,否则返回值为 0.NOT IN 的作用和 IN 恰好相反,NOT IN 用来判断表达式的值是否不存在于给出的列表中:如果不是 ...
- MyBatis源码环境搭建
之前研究mybatis都是参考前面学习的人的一些经验,并没有自己搭建源码环境进行.现在以mybatis3.4.6版本搭建,搭建过程中各种failed,下面大致记录环境搭建过程. 1.mybatis3. ...
- [LeetCode]LCP 01. 猜数字
小A 和 小B 在玩猜数字.小B 每次从 1, 2, 3 中随机选择一个,小A 每次也从 1, 2, 3 中选择一个猜.他们一共进行三次这个游戏,请返回 小A 猜对了几次? 输入的guess数组为 小 ...
- springboot整合mybatisplus使用记录
1. springboot项目基本配置 springboot基本pom依赖 <parent> <groupId>org.springframework.boot</gro ...