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;
});
}
}
  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批量插入的更多相关文章

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

    1. 批量更新插入 jdbcTemplate.batchUpdate(String sql, List<Object[]> batchArgs) Object[]数组的长度为每条记录的参数 ...

  2. spring jdbc批量插入

    http://blog.csdn.net/fyqcdbdx/article/details/7366439

  3. Spring利用JDBCTemplate实现批量插入和返回id

    1.先介绍一下java.sql.Connection接口提供的三个在执行插入语句后可取的自动生成的主键的方法: //第一个是 PreparedStatement prepareStatement(St ...

  4. spring data jpa开启批量插入、批量更新

    spring data jpa开启批量插入.批量更新 原文链接:https://www.cnblogs.com/blog5277/p/10661096.html 原文作者:博客园--曲高终和寡 *** ...

  5. (通用Mapper、分页,批量插入,一分钟接入)spring mvc+mybatis+maven集成tkmapper+pagehelper

    <!-- maven tkmapper引入--> <dependency> <groupId>tk.mybatis</groupId> <arti ...

  6. 【JDBC】使用Spring提供的JDBCTemplate通过Statement向MySql数据库插入千万条数据,耗时4m55s,使用insert语句批量插入方式二

    这回依然是使用 insert批量插入这种方式 insert into emp(name,age,cdate) values ('A' , 20, '2019-10-13 00:00:00'), ('B ...

  7. mybatis批量插入返回主键问题

    今天整合mybatis时候用到返回主键问题,批量插入总是返回不了主键还报错. 记录入下: pom版本: <mybatis.version>3.2.6</mybatis.version ...

  8. 批量插入数据(基于Mybatis的实现-Oracle)

    前言:做一个数据同步项目,要求:同步数据不丢失的情况下,提高插入性能. 项目DB框架:Mybatis.DataBase:Oracle. -------------------------------- ...

  9. mybatis批量插入数据到oracle

    mybatis 批量插入数据到oracle报 ”java.sql.SQLException: ORA-00933: SQL 命令未正确结束“  错误解决方法 oracle批量插入使用 insert a ...

随机推荐

  1. kali切换桌面环境

    感谢大佬:https://blog.csdn.net/tao546377318/article/details/52353018 kali 是基于Debian的发行版,兼容性和软件支持都很好,默认使用 ...

  2. js Array.prototype.slice.call(arguments,0) 理解

    Array.prototype.slice.call(arguments,0) 经常会看到这段代码用来处理函数的参数 网上很多复制粘帖说:Array.prototype.slice.call(argu ...

  3. new方法实现原理

    new方法实现原理 完整的创建一个可用的对象:Person *p=[Person new]; new方法的内部会分别调用两个方法来完成3件事情: (1)使用alloc方法来分配存储空间(返回分配的对象 ...

  4. python小白记录三——pycharm+selenium搭建环境之 no module named 'selenium'异常解决

    在pycharm上搭建python+selenium自动化测试环境时,遇到一个很坑的问题:no moduel named 'selenium' 如下图: 1.查看你的python是否正确安装了sele ...

  5. 第二章 初始MySQL 语法

    1.使用MySQL的优势 运行速度快.MySQL体积小,命令执行的速度快: 使用成本低.MySQL是开源的. 容易使用. 可移植性强.MySQL能够运行于多种系统平台之上,windows,linux, ...

  6. 深入分析CVE-2021-4034及漏洞复现

    正向shell总结 一.winrm,http.sys(端口复用) 介绍 winrm WinRM全称是Windows Remote Management,是微软服务器硬件管理功能的一部分,能够对本地或远 ...

  7. Oracle表数据或结构误删还原

    数据误删 表结构没有发生改变 --开启表字段转移,不开启无法还原 alter table 表名 enable row movement; --数据闪回 flashback table 表名 to ti ...

  8. ensp上防火墙的实现

    使用ensp模拟器中的防火墙(USG6000V)配置NAT(网页版)一.NAT介绍NAT(Network Address Translation,网络地址转换):简单来说就是将内部私有地址转换成公网地 ...

  9. Clickhouse写入问题汇总

    Clickhouse写入问题汇总 Zookeeper相关 当clickhouse在建表时使用了Replicated引擎族时, 会对zookeeper有非常重的依赖, 这时候就要注意zookeeper集 ...

  10. 企业BI应用解决方案主要包括哪些方面?

    BI的地位 在实际的BI应用过程中,很多企业对数据分析的概念仅为雏形,且业务人员往往难以了解自身数据分析的需求.这就造成很多BI需求调研在和业务人员沟通的环节,业务人员难以明确需求,这使得BI沦为一个 ...