Redis緩存穿透&雪崩
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
緩存穿透
概念
用戶如果想查詢一個(gè)數(shù)據(jù),會(huì)先在redis內(nèi)存數(shù)據(jù)庫中進(jìn)行查詢,redis中沒有,再向持久層數(shù)據(jù)庫中查詢。
緩存穿透的概念很簡單,用戶想要查詢一個(gè)數(shù)據(jù),發(fā)現(xiàn)redis內(nèi)存數(shù)據(jù)庫沒有,也就是緩存沒有命中,于是向持久層數(shù)據(jù)庫查詢。發(fā)現(xiàn)也沒有,于是本次查詢失敗。當(dāng)用戶很多的時(shí)候,緩存都沒有命中,于是都去請(qǐng)求了持久層數(shù)據(jù)庫。這會(huì)給持久層數(shù)據(jù)庫造成很大的壓力,甚至直接導(dǎo)致崩潰。這時(shí)候就相當(dāng)于出現(xiàn)了緩存穿透。
解決方案
1.布隆過濾器
布隆過濾器是一種數(shù)據(jù)結(jié)構(gòu),對(duì)所有可能查詢的參數(shù)以hash形式存儲(chǔ),在控制層先進(jìn)行
校驗(yàn),不符合則丟棄,從而避免了對(duì)底層存儲(chǔ)系統(tǒng)的查詢壓力;

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

但是這種方法會(huì)存在兩個(gè)問題:
如果空值能夠被緩存起來,這就意味著緩存需要更多的空間存儲(chǔ)更多的鍵,因?yàn)檫@當(dāng)中可能會(huì)有很多的空值的鍵;
即使對(duì)空值設(shè)置了過期時(shí)間,還是會(huì)存在緩存層和存儲(chǔ)層的數(shù)據(jù)會(huì)有一段時(shí)間窗口的不一致,這對(duì)于需要保持一致性的業(yè)務(wù)會(huì)有影響。
緩存擊穿
概念
這里需要注意和緩存穿透的區(qū)別:
緩存擊穿,是指一個(gè)key非常熱點(diǎn),大并發(fā)集中對(duì)這一個(gè)點(diǎn)進(jìn)行訪問,當(dāng)這個(gè)key在失效的瞬間,持續(xù)的大并發(fā)就穿破緩存,直接請(qǐng)求數(shù)據(jù)庫,就像在一個(gè)屏障上鑿開了一個(gè)洞。由于緩存過期,會(huì)同時(shí)訪問數(shù)據(jù)庫來查詢最新數(shù)據(jù),并且回寫緩存,會(huì)導(dǎo)使數(shù)據(jù)庫瞬間壓力過大。
解決方案
1.設(shè)置熱點(diǎn)數(shù)據(jù)永不過期
從緩存層面來看,沒有設(shè)置過期時(shí)間,所以不會(huì)出現(xiàn)熱點(diǎn)key過期后產(chǎn)生的問題。
2.加互斥鎖
分布式鎖:使用分布式鎖,保證對(duì)于每個(gè)key同時(shí)只有一個(gè)線程去查詢后端服務(wù),其他線程沒有獲得分布式鎖的權(quán)限,因此只需要等待即可。這種方式將高并發(fā)的壓力轉(zhuǎn)移到了分布式鎖,因此對(duì)分布式鎖的考驗(yàn)很大。
緩存雪崩
概念
緩存雪崩,是指在某一個(gè)時(shí)間段,緩存集中過期失效。
產(chǎn)生雪崩的原因之一,有一部分東西在redis中集中過期了,而對(duì)這些東西的訪問查詢,都落到了數(shù)據(jù)庫上,對(duì)于數(shù)據(jù)庫而言,就會(huì)產(chǎn)生周期性的壓力波峰。于是所有的請(qǐng)求都會(huì)達(dá)到存儲(chǔ)層,存儲(chǔ)層的調(diào)用量會(huì)暴增,造成存儲(chǔ)層也會(huì)掛掉的情況。

其實(shí)集中過期,倒不是非常致命,比較致命的緩存雪崩,是緩存服務(wù)器某個(gè)節(jié)點(diǎn)容機(jī)或斷網(wǎng)。
因?yàn)?strong>自然形成的緩存雪崩,一定是在某個(gè)時(shí)間段集中創(chuàng)建緩存,這個(gè)時(shí)候,數(shù)據(jù)庫也是可以頂住壓力的。無非就是對(duì)數(shù)據(jù)庫產(chǎn)生周期性的壓力而已。
而緩存服務(wù)節(jié)點(diǎn)的宕機(jī),對(duì)數(shù)據(jù)庫服務(wù)器造成的壓力是不可預(yù)知的,很有可能瞬間就把數(shù)據(jù)庫壓垮。
解決方案
1.redis高可用
這個(gè)思想的含義是,既然redis有可能掛掉,那可以多增設(shè)幾臺(tái)redis,這樣一臺(tái)掛掉之后其他的還可以繼續(xù)工作,其實(shí)就是搭建的集群。
2.限流降級(jí)
這個(gè)解決方案的思想是,在緩存失效后,通過加鎖或者隊(duì)列來控制讀數(shù)據(jù)庫寫緩存的線程數(shù)量。比如對(duì)某個(gè)key只允許一個(gè)線程查詢數(shù)據(jù)和寫緩存,其他線程等待。
3.數(shù)據(jù)預(yù)熱
數(shù)據(jù)加熱的含義就是在正式部署之前,我先把可能的數(shù)據(jù)先預(yù)先訪問一遍,這樣部分可能大量訪問的數(shù)據(jù)就會(huì)加載到緩存中。在即將發(fā)生大并發(fā)訪問前手動(dòng)觸發(fā)加載緩存不同的key,設(shè)置不同的過期時(shí)間,讓緩存失效的時(shí)間點(diǎn)盡量均勻。
作者 | MoYu-zc
來源 | urlify.cn/ri2eMf


