暢購商城(十四):秒殺系統「下」
阿新 • • 發佈:2020-10-18
好好學習,天天向上
本文已收錄至我的Github倉庫DayDayUP:github.com/RobodLee/DayDayUP,歡迎Star
- 暢購商城(一):環境搭建
- 暢購商城(二):分散式檔案系統FastDFS
- 暢購商城(三):商品管理
- 暢購商城(四):Lua、OpenResty、Canal實現廣告快取與同步
- 暢購商城(五):Elasticsearch實現商品搜尋
- 暢購商城(六):商品搜尋
- 暢購商城(七):Thymeleaf實現靜態頁
- 暢購商城(八):微服務閘道器和JWT令牌
- 暢購商城(九):Spring Security Oauth2
- 暢購商城(十):購物車
- 暢購商城(十一):訂單
- 暢購商城(十二):接入微信支付
- 暢購商城(十三):秒殺系統「上」
- 暢購商城(十四):秒殺系統「下」
防止秒殺重複排隊
回顧一下上一篇文章中講到的下單的流程。當用戶點選下單之後,使用者名稱和商品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,因為一個使用者只能下單一件商品,如果去下單其它商品,同樣也是重複排隊。
測試了一下,是成功的。但是有一個問題:如果使用者在這裡排隊未成功,該怎麼清理排隊資訊呢?這個下一步就會說,接著往下看