天天看點

使用Redis搭建電商秒殺系統

秒殺活動是絕大部分電商選擇的低價促銷、推廣品牌的方式。不僅可以給平台帶來使用者量,還可以提高平台知名度。一個好的秒殺系統,可以提高平台系統的穩定性和公平性,獲得更好的使用者體驗,提升平台的口碑,進而提升秒殺活動的最大價值。

本文讨論雲資料庫Redis版緩存設計高并發的秒殺系統。

秒殺活動對稀缺或者特價的商品進行定時定量售賣,吸引成大量的消費者進行搶購,但又隻有少部分消費者可以下單成功。是以,秒殺活動将在較短時間内産生比平時大數十倍,上百倍的頁面通路流量和下單請求流量。

秒殺活動可以分為3個階段:

秒殺前:使用者不斷重新整理商品詳情頁,頁面請求達到瞬時峰值。

秒殺開始:使用者點選秒殺按鈕,下單請求達到瞬時峰值。

秒殺後:一部分成功下單的使用者不斷重新整理訂單或者産生退單操作,大部分使用者繼續重新整理商品詳情頁等待退單機會。

消費者送出訂單,一般做法是利用資料庫的行級鎖,隻有搶到鎖的請求可以進行庫存查詢和下單操作。但是在高并發的情況下,資料庫無法承擔如此大的請求,往往會使整個服務blocked,在消費者看來就是伺服器當機。

使用Redis搭建電商秒殺系統

秒殺系統的流量雖然很高,但是實際有效流量是十分有限的。利用系統的層次結構,在每個階段提前校驗,攔截無效流量,可以減少大量無效的流量湧入資料庫。

利用浏覽器緩存和CDN抗壓靜态頁面流量

秒殺前,使用者不斷重新整理商品詳情頁,造成大量的頁面請求。是以,我們需要把秒殺商品詳情頁與普通的商品詳情頁分開。對于秒殺商品詳情頁盡量将能靜态化的元素靜态化處理,除了秒殺按鈕需要服務端進行動态判斷,其他的靜态資料可以緩存在浏覽器和CDN上。這樣,秒殺前重新整理頁面導緻的流量進入服務端的流量隻有很小的一部分。

利用讀寫分離Redis緩存攔截流量

CDN是第一級流量攔截,第二級流量攔截我們使用支援讀寫分離的Redis。在這一階段我們主要讀取資料,讀寫分離Redis能支援高達60萬以上qps,完全可以支援需求。

首先通過資料控制子產品,提前将秒殺商品緩存到讀寫分離Redis,并設定秒殺開始标記如下:

秒殺開始前,服務叢集讀取goodsId_Start為0,直接傳回未開始。

資料控制子產品将goodsId_start改為1,标志秒殺開始。

服務叢集緩存開始标記位并開始接受請求,并記錄到redis中goodsId_access,商品剩餘數量為(goodsId_count - goodsId_access)。

當接受下單數達到goodsId_count後,繼續攔截所有請求,商品剩餘數量為0。

可以看出,最後成功參與下單的請求隻有少部分可以被接受。在高并發的情況下,允許稍微多的流量進入。是以可以控制接受下單數的比例。

利用主從版Redis緩存加速庫存扣量

成功參與下單後,進入下層服務,開始進行訂單資訊校驗,庫存扣量。為了避免直接通路資料庫,我們使用主從版Redis來進行庫存扣量,主從版Redis提供10萬級别的QPS。使用Redis來優化庫存查詢,提前攔截秒殺失敗的請求,将大大提高系統的整體吞吐量。

通過資料控制子產品提前将庫存存入Redis,将每個秒殺商品在Redis中用一個hash結構表示。

扣量時,伺服器通過請求Redis擷取下單資格,通過以下lua腳本實作,由于Redis是單線程模型,lua可以保證多個指令的原子性。

先使用<code>SCRIPT LOAD</code>将lua腳本提前緩存在Redis,然後調用<code>EVALSHA</code>調用腳本,比直接調用<code>EVAL</code>節省網絡帶寬:

秒殺服務通過判斷Redis是否傳回搶購個數n,即可知道此次請求是否扣量成功。

使用主從版Redis實作簡單的消息隊列異步下單入庫

扣量完成後,需要進行訂單入庫。如果商品數量較少的時候,直接操作資料庫即可。如果秒殺的商品是1萬,甚至10萬級别,那資料庫鎖沖突将帶來很大的性能瓶頸。是以,利用消息隊列元件,當秒殺服務将訂單資訊寫入消息隊列後,即可認為下單完成,避免直接操作資料庫。

消息隊列元件依然可以使用Redis實作,在R2中用list資料結構表示。

 2.将訂單内容寫入Redis:

 3.異步下單子產品從Redis中順序擷取訂單資訊,并将訂單寫入資料庫。

通過使用Redis作為消息隊列,異步處理訂單入庫,有效的提高了使用者的下單完成速度。

資料控制子產品管理秒殺資料同步

最開始,利用讀寫分離Redis進行流量限制,隻讓部分流量進入下單。對于下單檢驗失敗和退單等情況,需要讓更多的流量進來。是以,資料控制子產品需要定時将資料庫中的資料進行一定的計算,同步到主從版Redis,同時再同步到讀寫分離的Redis,讓更多的流量進來。

https://help.aliyun.com/document_detail/63920.html?spm=a2c4g.11186623.4.1.551a6d9f9rnsDa