本篇文章給大家?guī)?lái)了關(guān)于Redis的相關(guān)知識(shí),其中主要介紹了關(guān)于怎么解決redis緩存雪崩、擊穿與穿透的相關(guān)問(wèn)題,緩存雪崩是指大量的請(qǐng)求無(wú)法命中Redis中的緩存數(shù)據(jù),也就是在Redis找不到數(shù)據(jù)了;下面一起來(lái)看一下,希望對(duì)大家有幫助。
千萬(wàn)級(jí)數(shù)據(jù)并發(fā)如何處理?進(jìn)入學(xué)習(xí)
推薦學(xué)習(xí):Redis視頻教程
一、緩存雪崩
1. 什么是緩存雪崩?
緩存雪崩
是指大量的請(qǐng)求無(wú)法命中Redis
中的緩存數(shù)據(jù),也就是在Redis
找不到數(shù)據(jù)了,那業(yè)務(wù)系統(tǒng)只能到數(shù)據(jù)庫(kù)中查詢,進(jìn)而導(dǎo)致所有的請(qǐng)求都發(fā)送到了數(shù)據(jù)庫(kù)。如下圖所示:
數(shù)據(jù)庫(kù)并不像Redis
能處理大量請(qǐng)求,由緩存雪崩導(dǎo)致的請(qǐng)求激增必須會(huì)導(dǎo)致數(shù)據(jù)庫(kù)所在宕機(jī),這樣勢(shì)必會(huì)影響業(yè)務(wù)系統(tǒng),所以如果發(fā)生緩存雪崩,對(duì)于業(yè)務(wù)系統(tǒng)肯定是致命的。
2. 為什么發(fā)會(huì)生緩存雪崩?
什么情況下出現(xiàn)緩存雪崩呢?總結(jié)起來(lái)有以下兩個(gè)方面的原因:
-
大量
Redis
緩存數(shù)據(jù)同時(shí)過(guò)期,導(dǎo)致所有的發(fā)送到Redis
請(qǐng)求都無(wú)法命中數(shù)據(jù),只能到數(shù)據(jù)庫(kù)中進(jìn)行查詢。 -
Redis
服務(wù)器宕機(jī),所有請(qǐng)求都無(wú)法經(jīng)Redis
來(lái)處理,只能轉(zhuǎn)向數(shù)據(jù)庫(kù)查詢數(shù)據(jù)。
3. 如何避免緩存雪崩?
針對(duì)導(dǎo)致緩存雪崩的原因,有不同的解決方法:
-
針對(duì)大量緩存隨機(jī)過(guò)期時(shí)間,解決方法就是在原始過(guò)期時(shí)間的基礎(chǔ)上,再加一個(gè)隨機(jī)過(guò)期時(shí)間,比如1到5分鐘之間的隨機(jī)過(guò)期時(shí)間,這樣可以避免大量的緩存數(shù)據(jù)在同一時(shí)間過(guò)期。
-
而針對(duì)
Redis
解決宕機(jī)的導(dǎo)致的緩存雪崩,可以提前搭建好Redis
的主從服務(wù)器進(jìn)行數(shù)據(jù)同步,并配置哨兵機(jī)制,這樣在Redis
服務(wù)器因?yàn)殄礄C(jī)而無(wú)法提供服務(wù)時(shí),可以由哨兵將Redis
從服務(wù)器設(shè)置為主服務(wù)器,繼續(xù)提供服務(wù)。
二、緩存擊穿
1. 什么是緩存擊穿
緩存擊穿與緩存雪崩的情況相似,雪崩是因?yàn)榇罅康臄?shù)據(jù)過(guò)期,而緩存擊穿則是指熱點(diǎn)數(shù)據(jù)過(guò)期,所有針對(duì)熱點(diǎn)數(shù)據(jù)的請(qǐng)求都需要到數(shù)據(jù)庫(kù)中進(jìn)行處理,如下圖所示:
2. 怎么避免緩存擊穿?
解決緩存擊穿的三種方式:
- 不設(shè)置過(guò)期時(shí)間
如果我們能提前知道某個(gè)數(shù)據(jù)是熱點(diǎn)數(shù)據(jù),那么就可以不設(shè)置這些數(shù)據(jù)的過(guò)期,從而避免緩存擊穿問(wèn)題,比如一些秒殺活動(dòng)的商品,在秒殺時(shí)會(huì)大量用戶訪問(wèn),這時(shí)候我們就可以將這些用于秒殺的商品數(shù)據(jù)提前寫入緩存并且不設(shè)置過(guò)期時(shí)間。
- 互斥鎖
提前知道某些數(shù)據(jù)會(huì)有大量訪問(wèn),我們當(dāng)然可以設(shè)置不過(guò)期,但