日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

实现秒杀的几个想法(续)

發布時間:2024/1/17 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实现秒杀的几个想法(续) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自:http://blog.itpub.net/29254281/viewspace-1800617/

還是秒殺.
秒殺一般有幾個場景
1.電商秒殺商品
2.搶紅包
3.搶票

假設一個場景如下:
? ? 某電商公司搞活動,一折秒殺,推出幾種秒殺的商品,每種商品1000個,預計100w人搶購
要求:
? ? 不能超賣.絕對不可以賣多了.
? ? 數據庫要扣減庫存,并且記錄訂單明細.

難點分析
1.不能阻塞.
海量的請求就像血栓一樣,遍走周身,一旦遇到瓶頸,就會堵塞整個血管.
所以一定要讓海量的用戶請求,盡快結束.

2.數據庫單行更新
大量的 update 庫存表 set 剩余數量=剩余數量-1 where 商品ID=?
這種單行更新,有行鎖,會阻塞其他事務,占用寶貴的數據庫處理能力.

針對這種場景,綜合了很多資料
我覺得可以嘗試幾個關于秒殺的優化.



1.Web服務器集群層,卸載流量
? ? 海量的用戶秒殺請求,本質上是一個排序,先到先得.
????但是如此之多的請求,完全響應,難度又很大.
? ? 所以在Web服務器集群,可以考慮卸載流量.
? ? 比如每十個請求,隨機拋棄九個,只放行一個請求到后續處理環節.
? ? 把秒殺的排序模式,變為隨機抽獎的模式.
????
2.Web服務器集群層,縮小鎖范圍.
? ? 每次秒殺活動開始之前.先計算活動推出的商品數量,然后分配一個限額到每個Web服務器.
? ? 比如一個活動推出秒殺商品
? ? 電視,手機,衣服各1000件,那么每臺服務器的限額就是125件.
? ? 將這個限額寫入ZooKeeper,Web服務器監聽到限額的變化,就會重新初始化各自的商品剩余數量.

模擬示例:

  • ????private static ConcurrentHashMap<String,Integer> map=new ConcurrentHashMap<String, Integer>();
  • ????
  • ????private void zooKeeperHandle(){
  • ????????//將ZooKeeper的變化,初始化到Web服務器全局容器
  • ????????map.put("電視機", 125);
  • ????????map.put("手機", 125);
  • ????????map.put("衣服", 125);
  • ????}
  • ? ? 假設用戶請求秒殺電視機,它只是鎖了該Web服務器電視機的數量。(該Web服務器手機和衣服還可以繼續并發處理,當然其他的Web服務器也在同時處理電視機的秒殺請求)
    ? ? 這樣縮小了鎖定的范圍,增加了系統處理的吞吐量.

    ????如果這個剩余數量大于零,則將用戶ID放入電視機購買隊列,然后告知用戶秒殺成功
    ? ? 如果這個剩余數量等于零,則告知用戶秒殺失敗.即便別的Web服務器還有電視機的剩余配額.

    3.ZooKeeper層,ZooKeeper變更庫存信息
    ? ? 假設活動期間,需要修改庫存信息。
    ? ? 兩種可能,
    ? ? 第一種,該商品已經賣了500件,電商不想繼續賣了.
    ? ? 第二種,從倉庫中又找到了一些積壓庫存..

    ? ? 兩種情況,都直接修改ZooKeeper中相應商品的配額.
    ? ? Web服務器會監聽變化,并重新初始化全局容器.

    4.消息隊列層,多消費者處理
    ? ? 消費者主要是從隊列獲取購買請求,發送至數據庫
    ? ? 扣減數據庫庫存
    ? ? 寫訂單明細記錄


    5.數據庫層,使用存儲過程代替JDBC調用
    ? ? 由于使用了多消費者處理同一隊列,增加吞吐量,避免隊列堆積過大.
    ? ? 但是多消費者,必然導致數據庫出現單行更新問題.

    ? ? 單行更新問題就是多個線程,并發修改同一條記錄,導致事務相互阻塞.浪費了數據庫寶貴的處理能力.
    ? ? 考查下圖.
    ????假設消費者到數據庫的網絡是1毫秒
    ? ? 那么相對于存儲過程,使用JDBC的方式,每個事務將至少多持有行鎖2毫秒.

    ? ? 所以進一步優化,可以考慮用存儲過程代替JDBC


    6.數據庫層,庫存單行更新,增加多個槽位.
    ? ? 單行更新場景

    ? ? 增加槽位的表結構

    ? ?
    ????使用槽位分散行鎖
    ? ? 每種商品的庫存,由4個槽位組成.
    ? ? 事務開始,首先找到剩余數量最多的那個商品槽位.
    ? ? 然后扣減該槽位的庫存.
    ? ? 這樣一個行鎖,可以變為4個行鎖,系統吞吐量增加了4倍.
    ? ? (其實如果update的影響行數為0,表示該槽位已經沒有庫存.可以重復執行這個過程,再另選一個槽位)

  • //開始事務
  • select 商品,剩余數量,@槽位:=Slot from 庫存表
  • where
  • 商品='電視機' and 剩余數量>0 and
  • 剩余數量=(select max(剩余數量) from 庫存表 where 商品='電視機')
  • limit 1;

  • update 庫存表 set 剩余數量=剩余數量-1 where 剩余數量>0 and 商品='電視機' and Slot=@槽位;
  • ?//如果update的影響行數不為0,寫訂單明細表
    commit;


    7.數據庫層,冷熱商品分開.
    ? ? 某些熱點商品,可以單獨放置在一個數據庫處理
    ? ? 比如蘋果手機新品,特賣打折 10w部
    ? ? 這種注定會熱的商品,應該使用單獨的數據庫處理
    ? ? 避免和普通商品競爭,堵塞本次活動其他商品的處理.

    參考:
    http://blog.itpub.net/29254281/viewspace-1783043/
    ? ??
    http://jiagou.baijia.baidu.com/article/108134?qq-pf-to=pcqq.group

    http://www.infoq.com/cn/presentations/seckill-solution-based-sql

    轉載于:https://www.cnblogs.com/yanwei-wang/p/5957137.html

    總結

    以上是生活随笔為你收集整理的实现秒杀的几个想法(续)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。