Spring boot redis自增編號控制 踩坑


近段期間,公司 接手一個訂單號生成服務,規則的話已經由項目經理他們規定好了,主要是后面的四位數代表的關於當前訂單號已經執行第幾個了。而這里面有一個要求就是支持分布式。為了實現這個東西,剛開始我使用了redis的incr來解決這個問題,因為我們后端開發用的是Spring boot,所以我網上找了一個代碼如下:

 1 /**
 2      *
 3      * @param key
 4      * @param liveTime
 5      * @return
 6      */
 7     public Long incr(String key, long liveTime) {
 8         RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
 9         Long increment = entityIdCounter.getAndIncrement();
10 
11         if ((null == increment || increment.longValue() == 0) && liveTime > 0) {//初始設置過期時間
12             entityIdCounter.expire(liveTime, TimeUnit.SECONDS);
13         }
14 
15         return increment;
16     }

結果測試的時候,看着后面的數很滿意,心里面有點小小的激動哦~~

但是當我將數據從小到大排序的時候,發現了一點異樣,即剛開始的幾個是存在問題的。

所以通過測試發現了,當redis里面還沒有設置計時器的一剎那,分布式服務下,會存在前幾個重復的現象。

發現這個問題之后,於是我通過redis鎖,當判斷redis下面還沒存在計數key的情況下,鎖住,然后在鎖住的情況下,其他人進來調用的時候,線程睡眠500ms,然后再往下執行。順利解決~~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM