淘寶、京東等搶購、秒殺功能,原來是這樣做到的

尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️

加入LINE好友

搶購、秒殺是如今很常見的一個應用場景,主要需要解決的問題有兩個:

1 高並發對數據庫產生的壓力

2 競爭狀態下如何解決庫存的正確減少(”超賣”問題)

對於第一個問題,已經很容易想到用緩存來處理搶購,避免直接操作數據庫,例如使用Redis。

重點在於第二個問題

常規寫法:

查詢出對應商品的庫存,看是否大於0,然後執行生成訂單等操作,但是在判斷庫存是否大於0處,如果在高並發下就會有問題,導致庫存量出現負數

優化方案1:將庫存字段number字段設為unsigned,當庫存為0時,因為字段不能為負數,將會返回false

優化方案2:使用MySQL的事務,鎖住操作的行

優化方案3:使用非阻塞的文件排他鎖

優化方案4:使用redis隊列,因為pop操作是原子的,即使有很多用戶同時到達,也是依次執行,推薦使用(mysql事務在高並發下性能下降很厲害,文件鎖的方式也是)

先將商品庫存如隊列

搶購、描述邏輯

模擬5000高並發測試

webbench -c 5000 -t 60 http://192.168.1.198/big/index.php

ab -r -n 6000 -c 5000 http://192.168.1.198/big/index.php

上述只是簡單模擬高並發下的搶購,真實場景要比這複雜很多,很多注意的地方

如搶購頁面做成靜態的,通過ajax調用接口

再如上面的會導致一個用戶搶多個,思路:

需要一個排隊隊列和搶購結果隊列及庫存隊列。高並發情況,先將用戶進入排隊隊列,用一個線程循環處理從排隊隊列取出一個用戶,判斷用戶是否已在搶購結果隊列,如果在,則已搶購,否則未搶購,庫存減1,寫數據庫,將用戶入結果隊列。

測試數據表

更多編程資訊、乾貨持續更新中~

About 尋夢園
尋夢園是台灣最大的聊天室及交友社群網站。 致力於發展能夠讓會員們彼此互動、盡情分享自我的平台。 擁有數百間不同的聊天室 ,讓您隨時隨地都能找到志同道合的好友!