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 ,返回前端庫存不足

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

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

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

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

  如果操作成功,  記錄用戶購買商品數量(redis_good_user),記錄訂單是否超時(redis_good_order_overtime)

 

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

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

 

用戶支付

  ① 用戶提交支付進入支付隊列中執行,開啓事務,第三方支付回調寫入 pay_notify(商品ID,訂單號,回調第三方,時間)支付回調錶

  ② 如果訂單業務隊列沒有處理完,用戶提交了支付,開啓事務,先執行訂單業務【寫入mysql 訂單表數據,商品庫存 -1,刪除 redis_order 表中的訂單號, 記錄用戶購買商品數量(redis_good_user)】  再執行支付業務。

 

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