AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

電商并發(fā)減庫(kù)存設(shè)計(jì),如何做到不超賣

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

前言

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

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

1、思路:

1)觸發(fā)開始開團(tuán)的同時(shí),把庫(kù)存數(shù)量更新到id對(duì)應(yīng)的隊(duì)列上去(定時(shí)更新,或者手動(dòng)更新)OOx28資訊網(wǎng)——每日最新資訊28at.com

2)用戶請(qǐng)求接口,如果隊(duì)列長(zhǎng)度>0,移除一個(gè)隊(duì)列記錄,同時(shí)對(duì)數(shù)據(jù)庫(kù)進(jìn)行相應(yīng)操作OOx28資訊網(wǎng)——每日最新資訊28at.com

3)如果隊(duì)列長(zhǎng)度<=0,攔截用戶的訪問,返回‘無庫(kù)存’OOx28資訊網(wǎng)——每日最新資訊28at.com

2、重點(diǎn)設(shè)計(jì)在數(shù)據(jù)庫(kù)層面

2張表:OOx28資訊網(wǎng)——每日最新資訊28at.com

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

字段: id, uid, goods_id, addtimeOOx28資訊網(wǎng)——每日最新資訊28at.com

第二張表:商品表 goodsOOx28資訊網(wǎng)——每日最新資訊28at.com

字段:goods_id goods_numOOx28資訊網(wǎng)——每日最新資訊28at.com

方案一

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

方案二

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

方案三

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

該方法完美的解決了超賣與select排它鎖導(dǎo)致的并發(fā)低的問題,并且4個(gè)sql縮減成2個(gè)sql語(yǔ)句。極大提升性能。OOx28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-100723-0.html電商并發(fā)減庫(kù)存設(shè)計(jì),如何做到不超賣

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: SpringBoot強(qiáng)大的分布式鎖組件Lock4j,支持多種實(shí)現(xiàn)

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

標(biāo)簽:
  • 熱門焦點(diǎn)
Top