日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

電商并發減庫存設計,如何做到不超賣

來源: 責編: 時間:2024-07-12 17:24:25 673觀看
導讀前言高并發的秒殺活動中,通過查詢數據庫判斷是否還有庫存,然后對庫存字段進行增減,極易出現庫存超出或者庫存為負的情況,一般來說有3中解決辦法(數據庫表加鎖,memche緩存,redis隊列);我們這里使用redis來解決問題1、思路:1)觸發

前言

高并發的秒殺活動中,通過查詢數據庫判斷是否還有庫存,然后對庫存字段進行增減,極易出現庫存超出或者庫存為負的情況,一般來說有3中解決辦法(數據庫表加鎖,memche緩存,redis隊列);CDD28資訊網——每日最新資訊28at.com

我們這里使用redis來解決問題

1、思路:

1)觸發開始開團的同時,把庫存數量更新到id對應的隊列上去(定時更新,或者手動更新)CDD28資訊網——每日最新資訊28at.com

2)用戶請求接口,如果隊列長度>0,移除一個隊列記錄,同時對數據庫進行相應操作CDD28資訊網——每日最新資訊28at.com

3)如果隊列長度<=0,攔截用戶的訪問,返回‘無庫存’CDD28資訊網——每日最新資訊28at.com

2、重點設計在數據庫層面

2張表:CDD28資訊網——每日最新資訊28at.com

第一張:判重表(buy_record),該用戶有沒秒殺過該商品CDD28資訊網——每日最新資訊28at.com

字段: id, uid, goods_id, addtimeCDD28資訊網——每日最新資訊28at.com

第二張表:商品表 goodsCDD28資訊網——每日最新資訊28at.com

字段:goods_id goods_numCDD28資訊網——每日最新資訊28at.com

方案一

start transaction;  select id from buy_record where uid=$uid and goods_id=$goods_id;  if(結果不為空)      拋異常,回滾。  insert into buy_record。。。  if(受影響行數<=0)          拋異常,回滾。。。    select goods_num from goods where goods_id=$good_id;  if(庫存<=0)          拋異常,回滾。。。    update goods set goods_num=goods_num-1 where goods_id=$goods_id;  if(受影響行數<=0)      該方法在高并發下幾乎必然導致超賣。當庫存為1的時候剛好多個用戶同時    select goods_num from goods where goods_id=$good_id;此時庫存剛好大于0,做update操作的時候必然減到小于0.  同時上面進行是否秒殺過的判重同樣會出現類似問題

方案二

start transaction;    select id from buy_record where uid=$uid and goods_id=$goods_id          for       update        ;  if(結果不為空)    拋異常,回滾。insert into buy_record。。。if(受影響行數<=0)    拋異常,回滾。。。    select goods_num from goods where goods_id=$good_id    for update    ;  if(庫存<=0)    拋異常,回滾。。。    update goods set goods_num=goods_num-1     where goods_id=$goods_id    ;  if(受影響行數<=0)    拋異常,回滾。。。
該方法有效的防止了超賣,但是在每次select的時候加上了排它鎖,每次select操作都會被堵塞    ,并發性能大大降低。

方案三

對(uid,goods_id)加唯一索引??!        start transaction;      insert into buy_record。。。    if(唯一索引報錯?)      拋異常,已經秒過了,回滾。。。            update goods set goods_num=goods_num-1                         where goods_id=$goods_id          and                goods_num>0            ;        if(受影響行數<=0)      拋異常,商品秒完了,回滾。。。

該方法完美的解決了超賣與select排它鎖導致的并發低的問題,并且4個sql縮減成2個sql語句。極大提升性能。CDD28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-100723-0.html電商并發減庫存設計,如何做到不超賣

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: SpringBoot強大的分布式鎖組件Lock4j,支持多種實現

下一篇: React 支持 Form Action 是在作妖?不,它是一種重磅回歸

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 聂拉木县| 抚顺县| 沿河| 孝感市| 南京市| 崇文区| 明光市| 蒙山县| 三明市| 鲁山县| 泗洪县| 田林县| 双城市| 泾源县| 绥德县| 比如县| 边坝县| 金门县| 南充市| 社旗县| 广灵县| 通许县| 滕州市| 莱芜市| 南川市| 黄大仙区| 嫩江县| 仁寿县| 商都县| 金山区| 闽清县| 荥阳市| 衢州市| 繁峙县| 南岸区| 元江| 唐海县| 湖口县| 平远县| 玛曲县| 日土县|