電商網站50W-100W高併發,秒殺功能是怎麼實現的?redis
在淘寶、天貓、京東等國內大型電商平臺「造節」的帶領下,國內各電商平臺紛紛跟進,雙11、雙12、618等電商專屬節日也吸引了大量的用戶參與。節前生意慘淡、訪客寥寥,節日當天流量增加卻異常迅猛,這對於廣大程序猿同窗和運維人員來講,無疑是巨大的考驗。數據庫
秒殺系統的流量雖然很高,可是實際有效流量比較小;利用系統的層次結構,在每一個階段提早校驗,攔截無效流量,能夠減小大量無效流量涌入數據庫,從而保障業務系統的正常運行;後端
第一步:利用瀏覽器緩存和CDN加速靜態頁面抵擋第一層流量瀏覽器
秒殺前,用戶不斷刷新商品詳情頁,形成大量的頁面請求。因此咱們須要把秒殺商品詳情頁與普通的商品詳情頁分開;對於秒殺商品詳情頁儘可能將靜態化的元素靜態化處理,除了秒殺按鈕須要服務端進行動態判斷外,其餘的靜態數據能夠緩存在瀏覽器和CDN上,這樣秒殺前刷新頁面的流量僅有一小部分會訪問後端服務器和數據庫;緩存
第二步:利用redis緩存攔截部分流量(只讀Redis)服務器
利用CDN攔截第一級流量,第二級流量攔截咱們使用redis,咱們須要提早把秒殺的商品數據寫入到Redis,並經過程序進行秒殺相應邏輯的設定(只容許經過對應秒殺數量的請求);併發
第三步:利用Redis緩存進行庫存量的扣除(讀寫Redis)運維
成功下單後,進入下層服務,開始進行訂單信息校驗,庫存扣除;爲了不直接訪問數據庫,咱們使用Redis來進行庫存扣除(庫存數量提早寫入redis);庫存扣除時,服務器經過請求redis獲取下單資格,因爲redis是單線程模型,能夠保證多個命令的原子性;異步
第四步:利用redis實現簡單的消息隊列異步下單入庫高併發
庫存扣除後,須要進行訂單入庫,若是商品數量較少,能夠直接操做數據庫,但若是數據量較大,那麼數據庫鎖衝突將帶來很大的性能瓶頸,能夠考慮使用 消息隊列,當秒殺服務將訂單信息寫入消息隊列後,便可認爲下單完成,避免直接操做數據庫;利用異步下單模塊從redis中讀取訂單並寫入數據庫便可完成;