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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

商品詳情頁面的靜態化,varnish加速,秒殺商品庫獨立部署服務器這種就略過不講了。只討論庫存部分的優化

mysql配置層面的優化可以參考我的這篇文章?《關于mysql innodb引擎性能優化的一點心得》

重點設計在數據庫層面。

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(結果不為空)

????拋異常,回滾。

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語句。極大提升性能

轉載于:https://www.cnblogs.com/ExMan/p/10272861.html

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。