秒殺系統,是典型的短時大量突發訪問類問題。對這類問題,有三種優化效能的思路:
寫入記憶體而不是寫入硬碟
非同步處理而不是同步處理
分布式處理
用上這三招,不論秒殺時負載多大,都能輕鬆應對。更好的是,redis能夠滿足上述三點。因此,用redis就能輕鬆實現秒殺系統。
用我這個方案,無論是電商平台**秒殺,12306火車票秒殺,都不是事:)
下面介紹一下為什麼上述三種效能優化思路能夠解決秒殺系統的效能問題:
redis和redis cluster(分布式版本),是乙個分布式快取系統。其支援多種資料結構,也支援mq。redis在效能上做了大量優化。因此使用redis或者redis cluster就可以輕鬆實現乙個強大的秒殺系統。
基本上,你用redis的這些命令就可以了。
rpush key value
插入秒殺請求
當插入的秒殺請求數達到上限時,停止所有後續插入。
後台啟動多個工作執行緒,使用
lpop key
讀取秒殺成功者的使用者id,進行後續處理。
或者使用lrange key start end命令讀取秒殺成功者的使用者id,進行後續處理。
每完成一條秒殺記錄的處理,就執行incr key_num。一旦所有庫存處理完畢,就結束該商品的本次秒殺,關閉工作執行緒,也不再接收秒殺請求。
也許你會說,我們的客戶很多。即使部署了redis cluster,仍然撐不住。那該怎麼辦呢?
記得某個偉人曾經說過:辦法總比困難多!
下面,我們具體分析下,還有哪些情況會壓垮我們架構在redis(cluster)上的秒殺系統。
如現在有很多搶火車票的軟體。它們會自動發起http請求。乙個客戶端一秒會發起很多次請求。如果有很多使用者使用了這樣的軟體,就可能會直接把我們的交換機給壓垮了。
這個問題其實屬於網路問題的範疇,和我們的秒殺系統不在乙個層面上。因此不應該由我們來解決。很多交換機都有防止乙個源ip發起過多請求的功能。開源軟體也有不少能實現這點。如linux上的tc可以控制。流行的web伺服器nginx(它也可以看做是乙個七層軟交換機)也可以通過配置做到這一點。乙個ip,一秒鐘我就允許你訪問我2次,其他軟體包直接給你丟了,你還能壓垮我嗎?
可能你們的客戶併發訪問量實在太大了,交換機都撐不住了。
這也有辦法。我們可以用多個交換機為我們的秒殺系統服務。
原理就是dns可以對乙個網域名稱返回多個ip,並且對不同的源ip,同乙個網域名稱返回不同的ip。如網通使用者訪問,就返回乙個網通機房的ip;電信使用者訪問,就返回乙個電信機房的ip。也就是用cdn了!
我們可以部署多台交換機為不同的使用者服務。 使用者通過這些交換機訪問後面資料中心的redis cluster進行秒殺作業。
有了redis cluster的幫助,做個支援海量使用者的秒殺系統其實so easy!
這裡介紹的方案雖然是針對秒殺系統的,但其背後的原理對其他高併發系統一樣有效。
最後,我們再重溫一下高效能系統的優化原則:
寫入記憶體而不是寫入硬碟
非同步處理而不是同步處理
分布式處理
用Redis輕鬆實現秒殺系統
秒殺系統,是典型的短時大量突發訪問類問題。對這類問題,有三種優化效能的思路 寫入記憶體而不是寫入硬碟 非同步處理而不是同步處理 分布式處理 用上這三招,不論秒殺時負載多大,都能輕鬆應對。更好的是,redis能夠滿足上述三點。因此,用redis就能輕鬆實現秒殺系統。用我這個方案,無論是電商平台 秒殺,...
用Redis輕鬆實現秒殺系統
秒殺系統,是典型的短時大量突發訪問類問題。對這類問題,有三種優化效能的思路 寫入記憶體而不是寫入硬碟 非同步處理而不是同步處理 分布式處理 用上這三招,不論秒殺時負載多大,都能輕鬆應對。更好的是,redis能夠滿足上述三點。因此,用redis就能輕鬆實現秒殺系統。用我這個方案,無論是電商平台 秒殺,...
用Redis輕鬆實現秒殺系統
秒殺系統,是典型的短時大量突發訪問類問題。對這類問題,有三種優化效能的思路 1 寫入記憶體而不是寫入硬碟 2 非同步處理而不是同步處理 3 分布式處理 用上這三招,不論秒殺時負載多大,都能輕鬆應對。更好的是,redis能夠滿足上述三點。因此,用redis就能輕鬆實現秒殺系統。用我這個方案,無論是電商...