使用Redis搭建電商秒殺系統(tǒng)
秒殺活動(dòng)是絕大部分電商選擇的低價(jià)促銷、推廣品牌的方式。不僅可以給平臺(tái)帶來用戶量,還可以提高平臺(tái)知名度。一個(gè)好的秒殺系統(tǒng),可以提高平臺(tái)系統(tǒng)的穩(wěn)定性和公平性,獲得更好的用戶體驗(yàn),提升平臺(tái)的口碑,從而提升秒殺活動(dòng)的最大價(jià)值。
一 秒殺的特征
秒殺活動(dòng)對(duì)稀缺或者特價(jià)的商品進(jìn)行定時(shí)定量售賣,吸引成大量的消費(fèi)者進(jìn)行搶購,但又只有少部分消費(fèi)者可以下單成功。因此,秒殺活動(dòng)將在較短時(shí)間內(nèi)產(chǎn)生比平時(shí)大數(shù)十倍,上百倍的頁面訪問流量和下單請(qǐng)求流量。
秒殺活動(dòng)可以分為3個(gè)階段:- 秒殺前:用戶不斷刷新商品詳情頁,頁面請(qǐng)求達(dá)到瞬時(shí)峰值。
- 秒殺開始:用戶點(diǎn)擊秒殺按鈕,下單請(qǐng)求達(dá)到瞬時(shí)峰值。
- 秒殺后:一部分成功下單的用戶不斷刷新訂單或者產(chǎn)生退單操作,大部分用戶繼續(xù)刷新商品詳情頁等待退單機(jī)會(huì)。
二 秒殺系統(tǒng)
秒殺系統(tǒng)的流量雖然很高,但是實(shí)際有效流量是十分有限的。利用系統(tǒng)的層次結(jié)構(gòu),在每個(gè)階段提前校驗(yàn),攔截?zé)o效流量,可以減少大量無效的流量涌入數(shù)據(jù)庫。2.1 ?利用瀏覽器緩存和CDN抗壓靜態(tài)頁面流量
秒殺前,用戶不斷刷新商品詳情頁,造成大量的頁面請(qǐng)求。所以,我們需要把秒殺商品詳情頁與普通的商品詳情頁分開。對(duì)于秒殺商品詳情頁盡量將能靜態(tài)化的元素靜態(tài)化處理,除了秒殺按鈕需要服務(wù)端進(jìn)行動(dòng)態(tài)判斷,其他的靜態(tài)數(shù)據(jù)可以緩存在瀏覽器和CDN上。這樣,秒殺前刷新頁面導(dǎo)致的流量進(jìn)入服務(wù)端的流量只有很小的一部分。2.2 利用讀寫分離Redis緩存攔截流量
CDN是第一級(jí)流量攔截,第二級(jí)流量攔截我們使用支持讀寫分離的Redis。在這一階段我們主要讀取數(shù)據(jù),讀寫分離Redis能支持高達(dá)60萬以上qps,完全可以支持需求。首先通過數(shù)據(jù)控制模塊,提前將秒殺商品緩存到讀寫分離Redis,并設(shè)置秒殺開始標(biāo)記如下:
"goodsId_count": 100 //總數(shù)
"goodsId_start": 0 //開始標(biāo)記
"goodsId_access": 0 //接受下單數(shù)
- 秒殺開始前,服務(wù)集群讀取goodsId_Start為0,直接返回未開始。
- 數(shù)據(jù)控制模塊將goodsId_start改為1,標(biāo)志秒殺開始。
- 服務(wù)集群緩存開始標(biāo)記位并開始接受請(qǐng)求,并記錄到Redis中g(shù)oodsId_access,商品剩余數(shù)量為(goodsId_count - goodsId_access)。
- 當(dāng)接受下單數(shù)達(dá)到goodsId_count后,繼續(xù)攔截所有請(qǐng)求,商品剩余數(shù)量為0。
疑問