首先,此文章是接了如下文章写的
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();