PHP 商品秒殺搶購業務流程


搶購商品前准備工作

商品表、訂單表(訂單號設置唯一鍵)、賬單表、支付回調表

秒殺/搶購商品表字段:

  商品ID 

開始時間

秒殺/搶購時間(例如1個小時的搶購時間)

庫存(秒殺/搶購)數量(100 件)

限購數量(每人購買1件)

訂單超時(訂單創建多長時間未支付,系統自動取消訂單,30分鍾)

緩存表

    秒殺/搶購商品表:redis hash 表(redis_good,key=商品ID , value= 商品信息,可以選擇其他數據類型,具體根據自己的業務需要)

  商品庫存表:redis  key 表(redis_good_stock,key=商品ID, value=庫存數量 )

  商品訂單表:redis list 表(redis_order,key=good_order,value=商品訂單號)

  用戶購買商品數量表: redis key 表(redis_good_user,key=商品ID_用戶ID,value=購買商品的數量) 

  訂單超時記錄表: redis key 表(redis_good_order_overtime,key=商品ID_用戶ID,value=1,過期時間30分鍾)

 

1、將秒殺/搶購商品表數據取出存入redis_good

2、商品庫存 foreach 存入redis_good_stock 

3、商品詳情頁,后端查詢出數據,存入緩存,返回前端;前端接受數據緩存頁面,如果用戶客戶端刷新緩存,重新請求后端緩存,如果后端緩存不存在,重新查詢數據,並寫入緩存。

 

創建商品訂單

1、判斷商品(redis_good )是否達到搶購時間,如果沒有到達禁止購買或原價購買

2、如果已經到達搶購時間,判斷商品庫存數量(redis_good_stock)。

3、判斷用戶是否超出限購數量

  ① 用戶是否搶購過(redis_good_user),加上當前的是否超出限購數量,如果超出禁止購買或超出限購數量商品原價購買。

  ② 當前用戶選擇商品數量(redis_good_stock),如果超出禁止購買或超出限購數量商品原價購買。

4、用戶創建訂單

   ① 商品 redis_good_stock 表執行 -1 操作,如果 -1 小於0 ,返回前端庫存不足

   ② 如果庫存(redis_good_stock)操作 -1 大於等於 0 ,創建商品訂單號存入redis_order,進入訂單業務隊列(如果訂單號存入redis_order 表失敗,redis_good_stock 執行 +1 操作),返回前端端商品訂單號;

   隊列傳入數據:當前商品信息(redis_good )、商品訂單號、用戶ID、購買數量、時間  

  ③ 記錄訂單下單時間(redis_good_order_overtime),判斷是否超時

5、業務處理放入 think-queue 隊列(也可以選擇其他隊列)中

  開啟事務,寫入mysql 訂單表數據,商品庫存 -1 ,刪除 redis_order 表中的訂單號,如果操作失敗,返回前端訂單處理失敗(或在隊列中以消息推送的方式通知前端訂單處理失敗);

  如果操作成功,  記錄用戶購買商品數量(redis_good_user)

 

訂單列表頁(訂單詳情頁)

  判斷用戶是否超時未支付(redis_good_order_overtime),如果超時用戶購買商品數量(redis_good_user )- 訂單中的購買的數量,商品庫存(redis_good_stock)中 + 訂單中的購買的數量

 

用戶支付

  判斷數據庫中是否存在當前訂單數據

  ① 如果有數據,用戶提交支付進入支付隊列中執行,開啟事務,第三方支付回調寫入 pay_notify(商品ID,訂單號,回調第三方,時間)支付回調表

  ② 如果沒有數據,用戶提交了支付,開啟事務,先執行訂單業務【寫入mysql 訂單表數據,商品庫存 -1, 記錄用戶購買商品數量(redis_good_user)】  再執行支付業務。

  注意:寫入mysql 訂單表使用 try{}cache(){},防止與訂單隊列業務(訂單號唯一鍵)沖突,如果訂單列隊在次執行當前訂單業務必然失敗,同時刪除了 redis_order 表中的訂單號,所有此處不需要額外刪除 redis_order 表中的訂單號

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM