1. 程式人生 > 其它 >實現高併發的秒殺系統

實現高併發的秒殺系統

1. 實現高併發的秒殺系統,解決秒殺搶購系統的難點與困難,避免商品超賣 。

技術棧(redis + springboot +mysql)

2. 專案設計:

先進先出的佇列,例:商品為100份,使用長度為 100的佇列,實現消費者生產者模式,生產者負責接收使用者秒殺任務,將訂單號投送到佇列中( 條件:佇列未滿 )投送成功設定訂單狀態投送成功,消費者pull佇列訂單號實現扣減庫存操作。

3. 處理流程:

步驟1:開啟秒殺前24小時告訴使用者,提交訂單支付定金,提前在資料庫生成秒殺訂單設定訂單初始化狀態(此階段TPS不高,降低系統整體負載)。
步驟2:當JAVA生產者執行緒處理秒殺請求:
檢視是否存在秒殺訂單資料(可以查詢資料庫,提前快取到應用),
投送訂單到(redis)成功,設定資料庫訂單狀態投送成功後,可直接返回使用者秒殺成功。

步驟3:由JAVA消費者執行緒去實現資料庫存扣減庫存
注意1:使用redis實現佇列,多執行緒消費者去投送訂單,如果因佇列已滿,庫存為空秒殺業務已結束。
注意2:消費者去實現庫存扣減,(此階段秒殺基本結束對TPS要求不高)。

4. 優點

設定固定大小的佇列(商品:100份,長度:100佇列):避免商品超賣。
處理提前延後,通過提前生產秒殺訂單資料,延後處理扣庫存,降低系統負載。
主要負載集中在,訂單投送過程。

5.雙重檢查(double check):檢查(redis)佇列+資料庫資料狀態
生產者:投遞佇列成功,要設定資料庫中訂單狀態。
消費者:消費秒殺訂單時,要檢查是否存在佇列,訂單狀態是否投遞成功。