近段期間,公司 接手一個訂單號生成服務,規則的話已經由項目經理他們規定好了,主要是后面的四位數代表的關於當前訂單號已經執行第幾個了。而這里面有一個要求就是支持分布式。為了實現這個東西,剛開始我使用了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,然后再往下執行。順利解決~~~