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