回覆列表
-
1 # 非常程式碼
-
2 # 不會修電腦的技術宅
1.首先,我們會考慮利用資料庫的樂觀鎖和悲觀鎖來操作
但是悲觀鎖,每次拿資料都會上鎖,誰拿到鎖誰才會有操作的許可權。每一個操作都會對資源進行鎖定,會造成效率低下。
樂觀鎖,適合衝突比較少的情況,要不然一直retry,然而降低了系統的效能。而且寫的頻率過高。很容易造成系統崩潰。
我們採用變同步寫為非同步寫的redis方式。
我們採用redis來做秒殺,在秒殺之前,我們首先會將庫存讀到redis中,我們利用單程序單執行緒的redis進行併發的控制,並且redis為我們提供了兩種方式。
第一種是redis的事務的方式watch語句,會監視庫存的變化,如果我們在這次更新庫存中,庫存發生了變化,事務失敗,那麼我們會更新失敗。
還有一種是redis的list結構,類似於佇列的機制,序列執行。
每修改一次庫存,我們透過mq來更改資料庫
這是一種變同步為非同步的方式。
1、什麼是秒殺
所謂秒殺,就是網路賣家釋出一些超低價的商品,所有買家在同一時間網上搶購的一種銷售方式。
秒殺商品通常有兩種限制:時間限制,庫存限制。
2、秒殺系統場景特點
秒殺時大量使用者會在同一時間進行搶購,網站瞬時訪問量激增;
秒殺一般是訪問請求數量大於庫存數量,只有少部分使用者能夠秒殺成功;
秒殺業務流程比較簡單,一般就是下訂單減庫存。
3、秒殺架構設計思想
限流:鑑於只有少部分使用者能夠秒殺成功,所以要限制大部分流量,只允許少部分流量進入服務後端。
削峰:對於秒殺系統瞬時會有大量使用者湧入,所以在搶購一開始會有很高的瞬時峰值,高峰值流量是壓垮系統很重要的原因。實現削峰的常用方法是利用快取和訊息中介軟體等技術。
非同步處理:秒殺系統是一個高併發系統,採用非同步處理模式可以極大地提高系統併發量,也是削峰的一種實現方式。
記憶體快取:秒殺系統最大的瓶頸一般是資料庫讀寫,由於資料庫讀寫屬於磁碟IO,效能很低,如果能夠把部分資料或者業務邏輯轉移到記憶體快取,效率會有極大提升。
可拓展:如果想支援更多使用者,更大併發,最好將系統設計成彈性可拓展的,如果流量來了,拓展機器就好了,像淘寶、京東等雙十一活動時會增加機器應對峰值。
4、秒殺系統簡單實現
Redis是一個分散式快取系統,支援多種資料結構,我們可以利用Redis輕鬆實現一個強大的秒殺系統。對於每個使用者的秒殺,可以使用key-value的方式插入秒殺請求資料,當插入的秒殺請求數達到上限時,停止所有後續插入。
然後在後臺啟動多個工作執行緒,讀取秒殺成功者的ID,再操作資料庫做最終下訂單減庫存操作。
也可以把Redis替換成ActiveMQ、RabbitMQ等訊息中介軟體,也可以將快取和訊息中介軟體組合使用,快取系統負責接收記錄使用者請求,訊息中介軟體負責將快取中的請求同步到資料庫。