使用spring-data-redis实现incr自增
redis系列文章目录
- 使用spring-data-redis实现incr自增
- Redis 利用Hash存储节约内存
- Redis学习笔记(九)redis实现时时直播列表缓存,支持分页[热点数据存储]
- Redis学习笔记(八)redis之lua脚本学习
- Redis学习笔记(七)jedis超时重试机制注意事项
- Redis学习笔记(六)redis实现分布式锁
- Redis学习笔记(五)jedis(JedisCluster)操作Redis集群 redis-cluster
- redis学习笔记(四)缓存与数据库一致性问题
- redis学习笔记(三)数据淘汰策略
- redis学习笔记(二)JedisCluster + redis 3.2.5集群
- redis学习笔记(一)redis3.2.5集群安装与测试
应该有不少人在使用spring-data-redis时遇到各种各样的问题。反正我是遇到了。
由于是隔了一段时间才写的本篇博客,也懒得去重现哪些错误场景了,下面凭着记忆写了几个我遇到的问题:
redis.clients.jedis.exceptions.JedisDataException: ERR value is not an integer or out of range
使用的RedisTemplate
,做读写操作时候,都是要经过序列化和反序列化。这时你使用redisTemplate.opsForValue().increment()
就可能报错redis.clients.jedis.exceptions.JedisDataException: ERR value is not an integer or out of range
了。
valueOper.get(key) 获取不到自增的值。
于是我去看了一下redis的官方文档,找到一个解决方法
使用spring-data-redis实现incr自增
/**** @param key* @param liveTime* @return*/public Long incr(String key, long liveTime) {RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());Long increment = entityIdCounter.getAndIncrement();if ((null == increment || increment.longValue() == 0) && liveTime > 0) {//初始设置过期时间entityIdCounter.expire(liveTime, TimeUnit.SECONDS);}return increment;}
这样,上面的increment
就是自增后的新知值,然后中间通过entityIdCounter.expire(liveTime, TimeUnit.SECONDS);
设置过期时间。当然这里比较讨厌,spring没有在创建RedisAtomicLong
对象的时候一起设置过期时间。可以看看其源码,new RedisAtomicLong
最终调用的是这个方法:
private RedisAtomicLong(String redisCounter, RedisConnectionFactory factory, Long initialValue) {Assert.hasText(redisCounter, "a valid counter name is required");Assert.notNull(factory, "a valid factory is required");RedisTemplate<String, Long> redisTemplate = new RedisTemplate<String, Long>();redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new GenericToStringSerializer<Long>(Long.class));redisTemplate.setExposeConnection(true);redisTemplate.setConnectionFactory(factory);redisTemplate.afterPropertiesSet();this.key = redisCounter;this.generalOps = redisTemplate;this.operations = generalOps.opsForValue();if (initialValue == null) {if (this.operations.get(redisCounter) == null) {set(0);}} else {set(initialValue);}}
可以看到,初始值是0。
然后根进set
方法
public void set(long newValue) {operations.set(key, newValue);}
可以看到,他是采用的operations.set(key, newValue);
但是明明还有一个重载的方法void set(K key, V value, long timeout, TimeUnit unit);
可以设置过期时间,为啥spring不提供呢。
为了解决这个问题,我们可以自己模拟RedisAtomicLong
方法,去实现一个带有过期时间的自增方法。比较简单,读者自行撸代码吧,这里就不写出了。
使用spring-data-redis实现incr自增相关推荐
- Spring data redis 异常
2019独角兽企业重金招聘Python工程师标准>>> spring 集成 spring-data-redis 版本: spring低版本 + spring-data-redis 高 ...
- 使用Spring Data Redis操作Redis(集群版)
说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要自行引入,这个是个坑点.并且会与一些低版本的Sp ...
- Redis - Spring Data Redis 操作 Jedis 、Lettuce 、 Redisson
文章目录 官网 Jedis VS Lettuce Jedis Code POM依赖 配置文件 配置类 单元测试 Lettuce Code Redisson Code POM依赖 配置文件 配置类 单元 ...
- Spring Boot使用Spring Data Redis操作Redis(单机/集群)
说明:Spring Boot简化了Spring Data Redis的引入,只要引入spring-boot-starter-data-redis之后会自动下载相应的Spring Data Redis和 ...
- Java Spring Data Redis实战与配置参数详解 application.properties...
Redis作为开源分布式高并发缓存,使用范围非常广泛,主流互联网公司几乎都在使用. Java Spring Boot 2.0实战开发Redis缓存可以参考下面的步骤,Redis安装可以直接使用Linu ...
- Spring Data Redis与Jedis的选择(转)
说明:内容可能有点旧,需要在业务上做权衡. Redis的客户端有两种实现方式,一是可以直接调用Jedis来实现,二是可以使用Spring Data Redis,通过Spring的封装来调用.应该使用哪 ...
- Spring Data Redis—Pub/Sub(附Web项目源码)
一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...
- 一文搞定 Spring Data Redis 详解及实战
转载自 一文搞定 Spring Data Redis 详解及实战 SDR - Spring Data Redis的简称. Spring Data Redis提供了从Spring应用程序轻松配置和访问 ...
- Spring Data Redis:Sentinel的高可用性
1.概述 为了使Redis具有高可用性,我们可以使用Spring Data Redis对Redis Sentinel的支持. 借助Sentinel,我们可以创建自动抵御某些故障的Redis部署. Re ...
- 具有Java 8支持的Spring Framework 4.0.3和Spring Data Redis 1.2.1
Spring Framework 4.0.3 正如Spring社区宣布的那样,Spring Framework 4.0.3现在可用. 它是上周Java 8发布后框架的第一个版本,因此它是使用OpenJ ...
最新文章
- 2022年十大AI预测
- 正式发布!中国首个LF Edge捐赠项目Baetyl 2.2发布
- matlab 第i行到j行,matlab简明教程
- Arcgis创建SDE_Geometry、SDO_Geometry的区别【转】
- 简述工业机器人示教再现的一般步骤_基于激光焊缝跟踪传感器的工业机器人焊缝跟踪系统的应用焊接寻位...
- 英国四大运营商联合发文:驳斥“新冠病毒与5G有关”谣言
- 机器学习:matlab实现异常检测
- 2021美亚团队赛复盘
- PTA病毒序列C语言
- 好站推荐-四个在线识别字体网站,从此不在为找字体烦恼
- LED点阵书写显示屏
- zend framework 1.5.2 中实现梅花雪1.0树状菜单
- ParticleDesigner 粒子编辑器使用
- 登陆163邮箱 验证邮箱帐号密码是否正确
- AXI4协议学习:架构、信号定义、工作时序和握手机制
- 华为智慧屏和鸿蒙系统对比,华为智慧屏s55和v55区别-华为智慧屏s55和v55对比
- 《Cisco IPv6网络实现技术(修订版)》一1.5 IPv5
- e智团队实验室项目-第一周-神经网络的学习
- Android APN设置接口
- php图片批量上传插件下载,jQuery的多图片批量上传插件
热门文章
- 移动端购房工具--汇率计算的实现
- 服务器系统开机提示0xc000007b,重装系统出现0xc000007b无法正常启动怎么解决
- 微信公众号运营数据分析(二):内容分析讲解
- 知乎关键词排名,知乎关键词排名置顶第一的方法
- 【Git】push 分支报错 error: failed to push some refs to...
- rip neighbor_借助众筹平台Neighbor.ly透明地提高公民素质
- Redis高性能缓存数据库
- MD5加密算法(转)
- Android 相机开发
- [培训-DSP快速入门-3]:C54x DSP内存资源与内存空间分布