搶購、秒殺是如今很常見的一個應用場景,主要需要解決的問題有兩個:
1 高並發對數據庫產生的壓力
2 競爭狀態下如何解決庫存的正確減少("超賣"問題)
對於第一個問題,已經很容易想到用緩存來處理搶購,避免直接操作數據庫,例如使用Redis。第二個問題,我們可以使用redis隊列來完成,把要秒殺的商品放入到隊列中,因為pop操作是原子的,即使有很多用戶同時到達,也是依次執行,文件鎖和事務在高並發下性能下降很快,當然還要考慮其他方面的東西,比如搶購頁面做成靜態的,通過ajax調用接口,其中也可能會出現一個用戶搶多次的情況,這時候需要再加上一個排隊隊列和搶購結果隊列及庫存隊列。高並發情況下,將用戶進入排隊隊列,用一個線程循環處理從排隊隊列取出一個用戶,判斷用戶是否已在搶購結果隊列,如果在,則已搶購,否則未搶購,庫存減1,寫數據庫,將用戶入結果隊列。