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

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

> **好好學習,天天向上** > > 本文已收錄至我的Github倉庫[**DayDayUP**](https://github.com/RobodLee/DayDayUP):github.com/RobodLee/DayDayUP,歡迎Star + [暢購商城(一):環境搭建](https://blog.csdn.net/weixin_43461520/article/details/107095045) + [暢購商城(二):分散式檔案系統FastDFS](https://blog.csdn.net/weixin_43461520/article/details/107137843) + [暢購商城(三):商品管理](https://blog.csdn.net/weixin_43461520/article/details/107243543) + [暢購商城(四):Lua、OpenResty、Canal實現廣告快取與同步](https://blog.csdn.net/weixin_43461520/article/details/107348436) + [暢購商城(五):Elasticsearch實現商品搜尋](https://blog.csdn.net/weixin_43461520/article/details/107466286) + [暢購商城(六):商品搜尋](https://blog.csdn.net/weixin_43461520/article/details/107579868) + [暢購商城(七):Thymeleaf實現靜態頁](https://blog.csdn.net/weixin_43461520/article/details/107728072) + [暢購商城(八):微服務閘道器和JWT令牌](https://blog.csdn.net/weixin_43461520/article/details/107817503) + [暢購商城(九):Spring Security Oauth2](https://blog.csdn.net/weixin_43461520/article/details/108144023) + [暢購商城(十):購物車](https://blog.csdn.net/weixin_43461520/article/details/108268837) + [暢購商城(十一):訂單](https://blog.csdn.net/weixin_43461520/article/details/108319715) + [暢購商城(十二):接入微信支付](https://blog.csdn.net/weixin_43461520/article/details/108524375) + [暢購商城(十三):秒殺系統「上」](https://blog.csdn.net/weixin_43461520/article/details/108700669) + [暢購商城(十四):秒殺系統「下」](https://blog.csdn.net/weixin_43461520/article/details/109142617) ## 防止秒殺重複排隊 回顧一下上一篇文章中講到的下單的流程。當用戶點選下單之後,使用者名稱和商品id就會組裝成一個SeckillStatus物件存入Redis佇列中等待被處理,這個過程叫做排隊。所以說,只要使用者點選了一次下單後不論最後是否下單成功,他都會進入到排隊的狀態。如果使用者重複點選下單,那麼Redis佇列中就會有很多個相同的SeckillStatus物件,也就是一個使用者排隊多次,這顯然是不符合邏輯的,一個使用者應該只能排隊一次。 為了避免使用者重複排隊的情況,可以為每個使用者在Redis中設定一個自增值,每次排隊的時候加1,如果大於1,說明重複排隊了,那麼直接丟擲異常,告訴使用者重複排隊了。 ```java //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,因為一個使用者只能下單一件商品,如果去下單其它商品,同樣也是重複排隊。 ![](https://gitee.com/RobodLee/image_store/raw/master/Java/暢購商城14:秒殺系統下/防止重複排隊測試.png) 測試了一下,是成功的。但是有一個問題:如果使用者在這裡排隊未成功,該怎麼清理排隊資訊呢?這個下一步就會說,接著往下看