業(yè)務(wù)需求晰洒,秒殺iphone,庫存10臺啥箭,同時參與秒殺人員100w谍珊,不討論前端優(yōu)化(如產(chǎn)品信息緩存,腳本合并等)
解決方案:
N臺前端web服務(wù)器急侥,redis服務(wù)器1臺砌滞,數(shù)據(jù)庫服務(wù)器1臺
主要思路就是使用redis做計數(shù)器,簡單的實現(xiàn)一個排隊的策略缆巧,從而避免對數(shù)據(jù)庫的頻繁更新布持。redis通過INCR命令遞增,INCR命令本身為原子操作陕悬,性能至少在每秒5w以上题暖。
具體策略如下:
每臺web服務(wù)器上保留計數(shù)器的全局變量(c#為靜態(tài)變量,php保存為apc變量)捉超,用戶點擊秒殺按鈕胧卤,檢查變量是否>10(庫存數(shù))
1、如果小于10則去redis中incr拼岳,檢查返回值是否在庫存數(shù)以內(nèi)枝誊,
(1)如果小于庫存數(shù),修改全局變量惜纸。
然后進行數(shù)據(jù)庫操作(一條事務(wù)內(nèi)叶撒,減少庫存update product set stock=stock-1 where stock>10,???插入用戶訂單數(shù)據(jù),)耐版,進入后續(xù)付款流程祠够。
(2)如果大于庫存數(shù),則不做任何操作粪牲,直接返回秒殺結(jié)束古瓤。
2、如果是大于靜態(tài)變量,則直接返回秒殺結(jié)束落君。
這樣做的好處是實現(xiàn)了簡單的排隊功能穿香,不符合的用戶被篩選,減少數(shù)據(jù)庫更新壓力绎速,壓力集中在redis中皮获,通過全局變量來減緩redis壓力。