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