一篇文章輕鬆搞定SpringBoot + redis解決商品秒殺庫存超賣

推薦閱讀:前阿里P7架構師,分享工作心得及面試經驗,助力圓夢大廠

                  阿里P8架構師談:工作1-5年的Java工程師,怎樣提高核心競爭力

問題描述

在衆多搶購活動中,在有限的商品數量的限制下如何保證搶購到商品的用戶數不能大於商品數量,也就是不能出現超賣的問題;還有就是搶購時會出現大量用戶的訪問,如何提高用戶體驗效果也是一個問題,也就是要解決秒殺系統的性能問題。

本文主要介紹基於redis 實現商品秒殺功能。先來跟大家講下大概思路。總體思路就是要減少對數據庫的訪問,儘可能將數據緩存到Redis緩存中,從緩存中獲取數據。

  • 在系統初始化時,將商品的庫存數量加載到Redis緩存中;

  • 接收到秒殺請求時,在Redis中進行預減庫存,當Redis中的庫存不足時,直接返回秒殺失敗,否則繼續進行第3步;

  • 將請求放入異步隊列中,返回正在排隊中;

  • 服務端異步隊列將請求出隊,出隊成功的請求可以生成秒殺訂單,減少數據庫庫存,返回秒殺訂單詳情。

  • 當後臺訂單創建成功之後可以通過websocket向用戶發送一個秒殺成功通知。前端以此來判斷是否秒殺成功,秒殺成功則進入秒殺訂單詳情,否則秒殺失敗。

下面直接上代碼

系統初始化的時候將秒殺商品庫存放入redis緩存

SpringBoot + redis解決商品秒殺庫存超賣,看這篇文章就夠了

第二創建消息隊列(這裏爲了方便,我直接使用redis隊列來進行模擬操作)

 

第三 配置RedisTemplate序列化

SpringBoot + redis解決商品秒殺庫存超賣,看這篇文章就夠了

下面創建一個接口,在這個接口中創建10000個線程來模擬用戶商品搶購場景

SpringBoot + redis解決商品秒殺庫存超賣,看這篇文章就夠了

SpringBoot + redis解決商品秒殺庫存超賣,看這篇文章就夠了

這裏使用到了redis api中的decrement操作,預先減輕用戶搶購的數量,同時判斷redis中的庫存是否大於用戶搶購數量,如果小於0,直接提示用戶秒殺失敗,否則秒殺成功,進入redis消息隊列執行數據庫建庫存操作。

下面測試演示

SpringBoot + redis解決商品秒殺庫存超賣,看這篇文章就夠了

初始化商品庫存100,在測試一萬併發量後,最終發現不會不會出現超賣問題。因爲這裏一萬個併發,每個併發搶購10件商品。經過redis減庫存之後,最後只會有10個線程去更新數據庫。

注意:以上代碼只是解決了庫存超賣問題,實際功能還需要考慮很多業務場景。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章