Spring|Spring RedisTemplate批量插入
1. 循环请求
最容易想到也是最耗时的操作,不推荐使用。简单样例如下
@Service
public class RedisService {
@Resource
private RedisTemplate template;
public void multiSave(Map source) {
for(Map.Entry 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 template;
public void multiSave(Map source) {
template.executePipelined((RedisCallback
- multiSet
原生支持的批量操作,速度最快。
但是不灵活,使用范围较有限。比如hset支持一次多个插入,但是opsForHash()就没有multiSet,只有multiGet
也没有一起设置过期时间,仔细衡量业务场景后使用
@Service
public class RedisService {
@Resource
private RedisTemplate template;
public void multiSave(Map source) {
template.opsForValue().multiSet(source);
}
}
4. 总结对比 这里就用别人的测试结果吧,公司内网开发,上面代码都是手打;若有错漏请不吝指教
10万次插入的情况下
普通set消耗9010毫秒【Spring|Spring RedisTemplate批量插入】性能测试来源:https://blog.csdn.net/weixin_41677422/article/details/108626587
管道set消耗1606毫秒
批量set消耗18毫秒
推荐阅读
- Spring|Spring Boot提高开发效率必备工具lombok使用
- 关于Spring|关于Spring Cloud 本地属性覆盖的问题
- springboot使用mybatis一对多的关联查询问题记录
- 源码|第13期在线音乐网站前后分离springboot整合vue
- unity|Unity编辑器扩展(基于ScriptableWizard批量为预设添加继承于MonoBehaviour的脚本)
- SpringBoot+Redis实现布隆过滤器的示例代码
- SpringBoot解析yml全流程详解
- SpringCloud中的Feign远程调用接口传参失败问题
- java|java springboot的概述、特点与构建介绍
- JAVA|spring事务失效的原因