1. 程式人生 > 實用技巧 >暢購商城(十四):秒殺系統「下」

暢購商城(十四):秒殺系統「下」

好好學習,天天向上

本文已收錄至我的Github倉庫DayDayUP:github.com/RobodLee/DayDayUP,歡迎Star

防止秒殺重複排隊

回顧一下上一篇文章中講到的下單的流程。當用戶點選下單之後,使用者名稱和商品id就會組裝成一個SeckillStatus物件存入Redis佇列中等待被處理,這個過程叫做排隊。所以說,只要使用者點選了一次下單後不論最後是否下單成功,他都會進入到排隊的狀態。如果使用者重複點選下單,那麼Redis佇列中就會有很多個相同的SeckillStatus物件,也就是一個使用者排隊多次,這顯然是不符合邏輯的,一個使用者應該只能排隊一次。

為了避免使用者重複排隊的情況,可以為每個使用者在Redis中設定一個自增值,每次排隊的時候加1,如果大於1,說明重複排隊了,那麼直接丟擲異常,告訴使用者重複排隊了。

//SeckillOrderServiceImpl
@Override
public boolean add(Long id, String time, String username) {
    Long increment = redisTemplate.boundHashOps(SystemConstants.SEC_KILL_USER_QUEUE_COUNT).increment(username, 1);
    if (increment>1) {  //記錄指定hashkey的增量,大於1說明排隊次數超過1次,重複排隊
        throw new RuntimeException("重複排隊");
    }
	…………
}

這段程式碼中,添加了對使用者重複排隊的判斷,先自增1,再進行判斷。這裡的key設定的是username,因為一個使用者只能下單一件商品,如果去下單其它商品,同樣也是重複排隊。

測試了一下,是成功的。但是有一個問題:如果使用者在這裡排隊未成功,該怎麼清理排隊資訊呢?這個下一步就會說,接著往下看