<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          解密 Redis 助力雙 11 背后電商秒殺系統

          共 2712字,需瀏覽 6分鐘

           ·

          2020-10-31 01:09

          點擊上方藍色“?程序IT圈?”,選擇“設為星標”

          回復“資源”獲取獨家整理的學習資料!

          來源:t.cn/EAlQqQD

          • 背景
          • 秒殺的特征
          • 秒殺系統

          背景

          秒殺活動是絕大部分電商選擇的低價促銷,推廣品牌的方式。既可以給平臺帶來用戶量,還可以提高平臺知名度。一個好的秒殺系統,可以提高平臺系統的穩(wěn)定性和公平性,獲得更好的用戶體驗,提升平臺的口碑,從而提升秒殺活動的最大價值。

          本文討論云數據庫Redis版緩存設計高并發(fā)的秒殺系統。

          秒殺的特征

          秒殺活動對稀少或特價的商品進行定時定量售賣,吸引成大量的消費者進行搶購,但又只有少部分消費者可以下單成功。因此,秒殺活動將在一定時間內產生比平時大幾十倍倍,上百倍的頁面訪問流量和下單請求流量。

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

          • 秒殺前:用戶不斷刷新商品詳情頁,頁面請求達到臨時開頭。
          • 秒殺開始:用戶點擊秒殺按鈕,下單請求達到暫時提前。
          • 秒殺后:一部分成功下單的用戶不斷刷新訂單或產生退單操作,大部分用戶繼續(xù)刷新商品詳情頁等待退單機會。

          消費者提交的訂單,一般做法是利用數據庫的行級鎖,只有搶到鎖的請求可以進行庫存查詢和下單操作。但是在高并發(fā)的情況下,數據庫無法承受如此大的請求,往往需要整個服務被阻止,在消費者看來就是服務器停機機。

          秒殺系統

          利用系統的層次結構,在每個階段提前重新驗證,攔截無效流量,可以減少大量無效的流量涌入數據庫。

          利用瀏覽器緩存和CDN抗壓靜態(tài)頁面流量

          因此,我們需要把秒殺商品詳情頁與普通的商品詳情頁分開。關于秒殺商品詳情頁試圖將能靜態(tài)化的元素靜態(tài)化處理,除了秒殺按鈕需要服務端進行動態(tài)判斷,其他的靜態(tài)數據可以緩存在瀏覽器和CDN上。這樣,秒殺前刷新頁面導致的流量進入服務端的流量只有很小的一部分。

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

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

          首先通過數據控制模塊,提前將秒殺商品緩存到標識符分離Redis,并設置秒殺開始標記如下:

          "goodsId_count":?100?//總數
          "goodsId_start":?0???//開始標記
          "goodsId_access":?0??//接受下單數
          1. 秒殺開始前,服務重新讀取goodsId_Start為0,直接返回未開始。

          2. 數據控制模塊將goodsId_start改為1,標志秒殺開始。

          3. 服務最大化緩存開始標記位并開始接受請求,并記錄到redis中goodsId_access,商品剩余數量為(goodsId_count-goodsId_access)。

          4. 當接受下單數達到goodsId_count后,繼續(xù)攔截所有請求,商品剩余數量為0。

          可以拋光,最后成功參與下單的請求只有少部分可以被接受。在高并發(fā)的情況下,允許稍微多的流量進入。因此可以控制接受下單數的比例。

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

          成功避免下單后,進入下層服務,開始進行訂單信息校驗,庫存扣量。為了避免直接訪問數據庫,我們使用主從版Redis來進行庫存扣量,主從版Redis提供10萬等級的QPS。使用Redis來優(yōu)化庫存查詢,提前攔截秒殺失敗的請求,將大大提高系統的整體穩(wěn)定性。

          通過數據控制模塊提前將庫存存入Redis,將每個秒殺商品在Redis中用一個hash結構表示。

          "goodsId"?:?{
          ????"Total":?100
          ????"Booked":?100
          }

          扣量時,服務器通過請求Redis獲取下單資格,通過以下lua腳本實現,通過Redis是單線程模型,lua可以保證多個命令的原子性。

          local?n?=?tonumber(ARGV[1])
          if?not?n??or?n?==?0?then
          ????return?0
          end
          local?vals?=?redis.call("HMGET",?KEYS[1],?"Total",?"Booked");
          local?total?=?tonumber(vals[1])
          local?blocked?=?tonumber(vals[2])
          if?not?total?or?not?blocked?then
          ????return?0
          end
          if?blocked?+?n?<=?total?then
          ????redis.call("HINCRBY",?KEYS[1],?"Booked",?n)
          ????return?n;
          end
          return?0

          先使用SCRIPT LOAD將lua腳本EVALSHA預先緩存在Redis,然后調用調用腳本,比直接調用EVAL節(jié)省網絡帶寬:

          redis?127.0.0.1:6379>SCRIPT?LOAD?"lua?code"
          "438dd755f3fe0d32771753eb57f075b18fed7716"
          redis?127.0.0.1:6379>EVAL?438dd755f3fe0d32771753eb57f075b18fed7716?1?goodsId?1

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

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

          如果商品數量減少的時候,直接操作數據庫即可。如果秒殺的商品是1萬,甚至10萬等級,那數據庫鎖沖突將帶來很大的性能優(yōu)勢。。因此,利用消息組件,當秒殺服務將訂單信息寫入消息變量后,即可認為下單完成,避免直接操作數據庫。

          1. 消息模塊組件依然可以使用Redis實現,在R2中用列表數據結構表示。
          ```java
          ?????orderList?{
          ?????????[0]?=?{訂單內容}
          ?????????[1]?=?{訂單內容}
          ?????????[2]?=?{訂單內容}
          ?????????...
          ?????}
          1. 將訂單內容寫入
          ```java
          ????LPUSH?orderList?{訂單內容}
          1. 初步下單模塊從Redis中順序獲取訂單信息,將訂單寫入數據庫。
          ```java
          ?????BRPOP?orderList?0

          通過使用Redis作為消息收發(fā)器,異步處理訂單入庫,有效的提高了用戶的下單完成速度。

          數據控制模塊管理秒殺數據同步

          最開始,利用識別分離Redis進行流量限制,只讓部分流量進入下單。對于下單檢驗失敗和退單等情況,需要讓更多的流量進來。因此,數據控制模塊需要定時將數據庫中的數據進行一定的計算,同步到主從版Redis,同時再同步到讀寫分離的Redis,讓更多的流量進來。

          推薦閱讀

          ??21張圖揭秘在阿里、騰訊、美團工作的區(qū)別??圖解:數據結構中的6種「樹」,你心中有數嗎???架構 MVC,MVP 和 MVVM 圖示??常用算法復雜度速查表,收藏了!

          文章有幫助的話,在看,轉發(fā)吧。

          謝謝支持喲 (*^__^*)

          瀏覽 27
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  想要xx在线播放 | 色色色网站 | 成人AV一区二区三区 | 日韩三级在线免费观看 | 熟女人妻精品 |