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