如何解決秒殺商品時,商品超賣的情況

文章的思路主要來源於:http://www.csdn.net/article/2014-11-28/2822858

解決方案(以下方案都是基於分佈式的redis緩存):

1.用隊列解決大併發

建立一條隊列,將每個請求加入到隊列中,然後異步獲取隊列數據進行處理,把多線程的事情變成單線程,處理完一個就從隊列中刪除一個。但是會出現一個現象,請求特別多的時候,一瞬間將redis隊列內存撐爆,導致系統異常,又或者隊列內存足夠大,也是一種方案,但是,系統處理完一個隊列內請求的速度根本無法和瘋狂湧入隊列中的數目相比。也就是說,隊列內的請求會越積累越多,最終Web系統平均響應時候還是會大幅下降,系統還是陷入異常

2.利用redis中基於cas的樂觀鎖

採用計數器的方式,用一個集合,存放每個商品以及其對應的數量,如果只是單純的decr函數或者是incr函數,不能解決秒殺這種問題。因爲有可能在併發的情況下,兩個請求取到的數都是0,然後都加1,結果爲1,實際上應該是2。那麼這個時候建議利用樂觀鎖,實現自己的decr函數。

樂觀鎖的機制如同版本控制,如果修改的時候,要修改的value在redis中的值已經跟取出來時不一樣,則修改失敗。

def incr($key)
WATCH $key
$value=GET $Key
if not $value
$value=0
$value=$value+1
MULTI
set $key,$value
$result=EXEC
return result[0]
秒殺開始之前,將庫存量放到Redis當中,然後,對待每個請求,先判斷是否大於0,是的話,就去進行庫存量減一操作,如果成功,則商品信息加入購物車當中,如果失敗,則不能加入到購物車,返回秒殺失敗;小於0則直接返回秒殺失敗。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章