redis實現(xiàn)秒殺原理 redis為什么能實現(xiàn)秒殺?
redis為什么能實現(xiàn)秒殺?Redis是一個單線程,可以很好的解決并發(fā)問題如果用普通的代碼邏輯來實現(xiàn)秒殺,就會出現(xiàn)并發(fā)問題,導致多人秒殺成功,貨物超期交付。2使用redis可以對并發(fā)請求進行排隊,就像
redis為什么能實現(xiàn)秒殺?
Redis是一個單線程,可以很好的解決并發(fā)問題
如果用普通的代碼邏輯來實現(xiàn)秒殺,就會出現(xiàn)并發(fā)問題,導致多人秒殺成功,貨物超期交付。2使用redis可以對并發(fā)請求進行排隊,就像通過redis成功減少庫存后,人群中的人一個接一個地排隊一樣,我們可以減少網(wǎng)站數(shù)據(jù)庫中的庫存。當redis中沒有庫存請求時,我們就不會再輸入數(shù)據(jù),秒殺也不會成功
首先我們來看看seckill系統(tǒng)的業(yè)務流程,大致如下:
1。首先,判斷庫存是否足夠
2。如果足夠,扣除存貨
3。創(chuàng)建訂單然后付款
接下來,我們需要了解seckill系統(tǒng)的一個特點,就是請求量遠遠大于庫存量,成千上萬的用戶去搶一件商品,也就是說,可能90%的請求最終都是無效的,所以在這個前提下,看看如何削峰;
如何過濾掉大部分的無效流量,比如秒殺的訂單量是10個,即使100W用戶來了,最后也只生成10個訂單,所以在前端攔截無效用戶,防止大量的請求檢查庫存是否正常夠了,導致數(shù)據(jù)庫掛斷;分布式限流您可以使用redis初始化一個限制大小,如果超過限制大小,您可以直接丟棄請求;
例如,我們的數(shù)據(jù)庫中有10個商戶可以用來秒殺。實際上,您可以將這些數(shù)據(jù)放在分布式緩存中,這樣在檢查庫存時就不需要檢查數(shù)據(jù)庫。如果直接在緩存中檢查,速度會快得多;
如果要同步到數(shù)據(jù)庫,則不需要同步更新。您可以通過消息隊列(如rocketmq)進行異步更新。每次都可以把更新操作放到隊列中,消費端會更新操作;
同上,可以通過消息隊列異步創(chuàng)建訂單;
其實要記住幾個關鍵點:盡快隔離無效數(shù)據(jù),使用緩存不要在可以使用異步的地方直接查找數(shù)據(jù)庫,也不要在可以使用異步的地方同步。