日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

秒杀核心设计(减库存部分)-防超卖与高并发

發(fā)布時(shí)間:2023/12/13 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 秒杀核心设计(减库存部分)-防超卖与高并发 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

商品詳情頁面的靜態(tài)化,varnish加速,秒殺商品庫獨(dú)立部署服務(wù)器這種就略過不講了。只討論庫存部分的優(yōu)化

mysql配置層面的優(yōu)化可以參考我的這篇文章?《關(guān)于mysql innodb引擎性能優(yōu)化的一點(diǎn)心得》

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

2張表:

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

字段: id, uid, goods_id, addtime

第二張表:商品表 goods

字段: goods_id ? goods_num

方案1:

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(庫存<=0)

????拋異常,回滾。。。

update goods set goods_num=goods_num-1 where goods_id=$goods_id;

if(受影響行數(shù)<=0)

該方法在高并發(fā)下幾乎必然導(dǎo)致超賣。當(dāng)庫存為1的時(shí)候剛好多個(gè)用戶同時(shí)?select goods_num from goods where goods_id=$good_id;此時(shí)庫存剛好大于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(庫存<=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語句。極大提升性能

轉(zhuǎn)載于:https://www.cnblogs.com/ExMan/p/10272861.html

總結(jié)

以上是生活随笔為你收集整理的秒杀核心设计(减库存部分)-防超卖与高并发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。