偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

開(kāi)發(fā) 架構(gòu)
高并發(fā)的秒殺活動(dòng)中,通過(guò)查詢數(shù)據(jù)庫(kù)判斷是否還有庫(kù)存,然后對(duì)庫(kù)存字段進(jìn)行增減,極易出現(xiàn)庫(kù)存超出或者庫(kù)存為負(fù)的情況,一般來(lái)說(shuō)有3中解決辦法(數(shù)據(jù)庫(kù)表加鎖,memche緩存,redis隊(duì)列)。

前言

高并發(fā)的秒殺活動(dòng)中,通過(guò)查詢數(shù)據(jù)庫(kù)判斷是否還有庫(kù)存,然后對(duì)庫(kù)存字段進(jìn)行增減,極易出現(xiàn)庫(kù)存超出或者庫(kù)存為負(fù)的情況,一般來(lái)說(shuō)有3中解決辦法(數(shù)據(jù)庫(kù)表加鎖,memche緩存,redis隊(duì)列);

我們這里使用redis來(lái)解決問(wèn)題

1、思路:

1)觸發(fā)開(kāi)始開(kāi)團(tuán)的同時(shí),把庫(kù)存數(shù)量更新到id對(duì)應(yīng)的隊(duì)列上去(定時(shí)更新,或者手動(dòng)更新)

2)用戶請(qǐng)求接口,如果隊(duì)列長(zhǎng)度>0,移除一個(gè)隊(duì)列記錄,同時(shí)對(duì)數(shù)據(jù)庫(kù)進(jìn)行相應(yīng)操作

3)如果隊(duì)列長(zhǎng)度<=0,攔截用戶的訪問(wèn),返回‘無(wú)庫(kù)存’

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

2張表:

第一張:判重表(buy_record),該用戶有沒(méi)秒殺過(guò)該商品

字段: id, uid, goods_id, addtime

第二張表:商品表 goods

字段:goods_id goods_num

方案一

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)行是否秒殺過(guò)的判重同樣會(huì)出現(xiàn)類似問(wè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)秒過(guò)了,回滾。。。
            update goods set goods_num=goods_num-1                         where goods_id=$goods_id          and                goods_num>0            ;      
  if(受影響行數(shù)<=0)
      拋異常,商品秒完了,回滾。。。

該方法完美的解決了超賣與select排它鎖導(dǎo)致的并發(fā)低的問(wèn)題,并且4個(gè)sql縮減成2個(gè)sql語(yǔ)句。極大提升性能。

責(zé)任編輯:武曉燕 來(lái)源: 程序員編程日記
相關(guān)推薦

2025-08-14 09:47:44

2022-09-19 09:49:17

MCube網(wǎng)絡(luò)引擎

2025-08-29 16:24:37

2022-09-09 08:41:43

Netty服務(wù)端驅(qū)動(dòng)

2021-05-24 10:55:05

Netty單機(jī)并發(fā)

2024-12-04 13:52:30

2025-03-11 08:36:52

高并發(fā)場(chǎng)景性能

2017-09-11 16:34:00

2011-11-09 15:49:52

API

2021-08-02 09:01:05

MySQL 多版本并發(fā)數(shù)據(jù)庫(kù)

2025-10-28 03:00:00

并發(fā)場(chǎng)景數(shù)據(jù)庫(kù)

2009-11-20 11:37:11

Oracle完全卸載

2021-06-09 18:52:05

方案設(shè)計(jì)庫(kù)存數(shù)

2010-03-30 10:44:05

Nginx啟動(dòng)

2016-01-08 10:03:07

硅谷通吃互聯(lián)網(wǎng)

2019-08-08 10:18:15

運(yùn)維架構(gòu)技術(shù)

2020-11-10 09:05:45

用戶畫像蘇寧

2025-07-08 02:25:00

2013-04-22 10:34:46

用戶體驗(yàn)設(shè)計(jì)UED認(rèn)知負(fù)荷
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)