redis读取自增时候指定的key问题

本文探讨了在Spring Boot应用中使用Redis实现自增编号控制的方法及遇到的问题。特别是针对Redis自增计数器的有效期管理和无限期计数器的实现方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,此文章是接了如下文章写的

Spring boot redis自增编号控制 踩坑

上面这个问题解决后,公司这边功能其实已经实现了,但是考虑到一种情况,因为我们这边号的生成就是根据上面的自增编号来的,而redis里的自增编号是可以设置过期时间的,我这边设置的过期时间是根据客户的营业时间来换算获取的,

而当中碰到一个问题,因为考虑到客户营业时间是由客户自己维护的,所以不得不考虑当他们在同一天里面,刚开始设置的是一个上午的,后来在过期时间已经到了,redis中的计时器已经被自动清除的情况下,所以我这边再做一个计数器,

但是它的期限是无限期。当有限计时器过期导致这边数据找不到的时候,则从无限计时器去过来数据,并把它的值作为增量保存回到有限计时器中。而当中碰到一个问题:

代码1:

 1 /**
 2      * 读取缓存
 3      *
 4      * @param key
 5      * @return
 6      */
 7     public Object get(final String key) {
 8         Object result = null;
 9         ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
10         result = operations.get(key);
11         return result;
12     }

代码2:

 1 /**
 2      * redis 自增
 3      * @param key
 4      * @param liveTime 毫秒数 这个计数器的有效存留时间
 5      * @param delta 自增量
 6      * @return
 7      */
 8     public Long incr(String key, long liveTime, long delta) {
 9         RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
10         Long increment = entityIdCounter.addAndGet(delta);
11 
12         if ((null == increment || increment.longValue() == 0) && liveTime > 0) {//初始设置过期时间
13             entityIdCounter.expire(liveTime, TimeUnit.MILLISECONDS);
14         }
15 
16         return increment;
17     }

我通过代码1,去获取代码2生成的数据,结果发现不管怎么获取,都是null

必须要使用如下代码才能获取到值,尴尬呀!!!

RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
entityIdCounter.get();

转载于:https://www.cnblogs.com/Grace-is-enough/p/9235534.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值