實現商品秒殺總結

業務場景

       秒殺業務的特點就是開售瞬間大量用戶的涌入,例如雙十一搶購,短時間內會有大量用戶涌入系統,例如一種只有500件的商品會有幾百萬用戶在同時搶購,而最終搶購成功的用戶只有500人,大多數用戶都是搶購失敗。

業務分析

       短時間內大量用戶的高併發請求常常會壓垮系統,而瓶頸就在於數據庫,數據庫每秒僅能支持幾萬的併發量,而對於搶購每秒百萬千萬的併發量根本不足以應對,所以要將請求儘量攔截在系統上游,層層削峯,來最大程度的緩解數據庫的壓力。

解決方案

  • 前端優化

      1.頁面靜態化

         對於變化不頻繁的頁面,如商品詳情和訂單詳情頁面,可進行頁面靜態化處理,數據通過接口從後端動態獲取,實現前後端分離

      2.頁面緩存

         對於變化頻繁的頁面,如商品列表頁,可進行頁面手動渲染,然後緩存到redis中,並設置過期時間

      3.圖片驗證碼

         點擊秒殺時,先讓用戶輸入圖片驗證碼,校驗成功後纔可進行秒殺

      4.禁止重複提交

         用戶提交之後彈出遮罩或按鈕置灰,來防止用戶多次點擊

  • 後端優化

      1.利用緩存

         採用redis緩存,來減少對數據庫的訪問,系統啓動時可把商品庫存加載到redis中,在redis中預減庫存,並把商品、訂單、用戶等信息保存到redis中

      2.流量削峯

         採用消息隊列,來控制併發量,進行異步下單,把用戶的下單請求發送給消息隊列,當用戶請求超過消息隊列的最大數量時,直接拋棄用戶請求或返回搶購失敗頁面

      3.限制訪問次數

         利用redis的incr自增函數配合過期時間,限制同一用戶在指定時間內的訪問次數

      4.秒殺接口隱藏

         秒殺請求地址改爲動態生成,臨時請求,臨時生成,防止惡意用戶通過非法工具來請求秒殺接口

總結

       小併發可採用redis+lua命令方式,大併發可採用redis+rabbitmq消息隊列方式

       由於代碼比較多,我上傳在我的資源裏,地址:https://download.csdn.net/download/rexueqingchun/12087061

發佈了95 篇原創文章 · 獲贊 132 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章