redis緩存穿透及雪崩

什么是緩存穿透?(查不到)

緩存穿透是指,用戶想要查詢一個(gè)數(shù)據(jù),發(fā)現(xiàn)redis內(nèi)存數(shù)據(jù)庫(kù)沒(méi)有,也就是緩存沒(méi)有命中,于是向持久層數(shù)據(jù)庫(kù)中查詢,發(fā)現(xiàn)也沒(méi)有,于是本次查詢失敗。當(dāng)用戶請(qǐng)求很多的時(shí)候,緩存都沒(méi)有命中(如秒殺場(chǎng)景?。?,于是都去請(qǐng)求了持久層數(shù)據(jù)庫(kù)。這會(huì)給持久數(shù)據(jù)庫(kù)造成很大壓力,這時(shí)候就相當(dāng)于出現(xiàn)了緩存穿透。


緩存穿透.png

解決方案

  • 布隆過(guò)濾器(Bloom Filter)

布隆過(guò)濾器是一種數(shù)據(jù)結(jié)構(gòu),對(duì)所有可能查詢的參數(shù)以hash形式存儲(chǔ),在控制層先進(jìn)行校驗(yàn),不符合則丟棄,從而避免了對(duì)底層存儲(chǔ)系統(tǒng)的查詢壓力。


Bloom Filter.png
  • 緩存空對(duì)象(Cache Null)

當(dāng)存儲(chǔ)層不命中后,即使返回的空對(duì)象也將其緩存起來(lái),同時(shí)會(huì)設(shè)置一個(gè)過(guò)期時(shí)間,之后再訪問(wèn)這個(gè)數(shù)據(jù)將會(huì)從緩存中獲取,保護(hù)了后端數(shù)據(jù)源。


Cache Null.png

利用緩存空對(duì)象方式處理所存在的問(wèn)題:

  • 若空值能夠被緩存起來(lái),這就意味著緩存需要更多的空間存儲(chǔ)更多的鍵,因?yàn)檫@當(dāng)中可能會(huì)有很多的空值的鍵。
  • 即使對(duì)空值設(shè)置了過(guò)期時(shí)間,還是會(huì)存在緩存層和存儲(chǔ)層的數(shù)據(jù)會(huì)有一點(diǎn)時(shí)間窗口上的不一致,這對(duì)于需要保持?jǐn)?shù)據(jù)一直性的業(yè)務(wù)會(huì)有一定影響。

緩存擊穿(量太大,緩存過(guò)期)

緩存擊穿是指一個(gè)key非常熱點(diǎn),在不停地扛著大并發(fā),大并發(fā)集中對(duì)這個(gè)點(diǎn)進(jìn)行訪問(wèn),當(dāng)這個(gè)key失效的瞬間,持續(xù)的大并發(fā)就會(huì)擊穿緩存,直接請(qǐng)求數(shù)據(jù)庫(kù),就像是再屏幕上鑿開(kāi)了一個(gè)洞。

當(dāng)某個(gè)key在過(guò)期的瞬間,有大量請(qǐng)求并發(fā)訪問(wèn),這類(lèi)數(shù)據(jù)一般是熱點(diǎn)數(shù)據(jù),由于緩存過(guò)期,會(huì)同時(shí)訪問(wèn)數(shù)據(jù)庫(kù)來(lái)查詢最新數(shù)據(jù),并且回寫(xiě)緩存,會(huì)導(dǎo)致數(shù)據(jù)庫(kù)瞬間壓力過(guò)大。

解決方案

  • 設(shè)置熱點(diǎn)數(shù)據(jù)永不過(guò)期

從緩存層面來(lái)看,沒(méi)有對(duì)熱點(diǎn)key設(shè)置過(guò)期時(shí)間,所以不會(huì)出現(xiàn)熱點(diǎn)key過(guò)期后所產(chǎn)生的問(wèn)題。

  • 加互斥鎖(setnx)

分布式鎖:使用分布式鎖,保證對(duì)于每個(gè)key同時(shí)只有一個(gè)線程去查詢后端服務(wù),其他線程沒(méi)有獲得分布式鎖的權(quán)限,因此只需要等待即可。這種方式將高并發(fā)的壓力轉(zhuǎn)移到了分布式鎖,因此對(duì)分布式鎖的考驗(yàn)很大。

緩存雪崩

緩存雪崩是指,在某一個(gè)時(shí)間段,緩存集體失效。Redis宕機(jī)!

解決方案

  • Redis HA

既然redis可能發(fā)生宕機(jī),那不如多部署幾臺(tái),搭建redis集群,實(shí)現(xiàn)異地多活!

  • 限流降級(jí)

在緩存失效后,通過(guò)加鎖或隊(duì)列來(lái)控制讀數(shù)據(jù)庫(kù)和寫(xiě)緩存的線程數(shù)量。比如對(duì)某個(gè)key只允許一個(gè)線程查詢數(shù)據(jù)和寫(xiě)緩存,其他線程等待。

  • 數(shù)據(jù)預(yù)熱

在正式部署之前,我們可以先把可能的數(shù)據(jù)預(yù)先訪問(wèn)一遍,這樣部分可能大量被訪問(wèn)的數(shù)據(jù)就會(huì)加載到緩存中。在即將發(fā)生大并發(fā)訪問(wèn)前手動(dòng)觸發(fā)加載緩存不同的key,設(shè)置不同的過(guò)期時(shí)間,讓緩存失效的時(shí)間點(diǎn)盡量均勻。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

友情鏈接更多精彩內(nèi)容