redis緩存穿透,擊穿,雪崩

緩存穿透

緩存穿透的概念很簡單,用戶想要查詢一-個(gè)數(shù)據(jù) ,發(fā)現(xiàn)redis內(nèi)存數(shù)據(jù)庫沒有,也就是緩存沒有命中,,于是向持久層數(shù)據(jù)庫查詢。發(fā)現(xiàn)也沒有,于是本次查詢失敗。當(dāng)用戶很多的時(shí)候,緩存都沒有命中,于是都去請求了持久層數(shù)據(jù)庫。這會給持久層數(shù)據(jù)庫造成很大的壓力,這時(shí)候就相當(dāng)于出現(xiàn)了緩存穿透。

解決方案

布隆過濾器

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

布隆過濾器

緩存空對象

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


緩存空對象

但是這種方法會存在兩個(gè)問題:
1、如果空值能夠被緩存起來,這就意味著緩存需要更多的空間存儲更多的鍵,因?yàn)檫@當(dāng)中可能會有很多的空值的鍵;
2、即使對空值設(shè)置了過期時(shí)間,還是會存在緩存層和存儲層的數(shù)據(jù)會有一-段時(shí)間窗口的不一 致,這對于需要保持一致性的業(yè)務(wù)會
有影響。

緩存擊穿

這里需要注意和緩存擊穿的區(qū)別,緩存擊穿,是指一-個(gè)key非常熱點(diǎn),在不停的扛著大并發(fā),大并發(fā)集中對這一一個(gè)點(diǎn)進(jìn)行訪問 ,當(dāng)·這個(gè)key在失效的瞬間,持續(xù)的大并發(fā)就穿破緩存,直接請求數(shù)據(jù)庫,就像在一個(gè)屏障上鑿開了一個(gè)洞。
當(dāng)某個(gè)key在過期的瞬間,有大量的請求并發(fā)訪問,這類數(shù)據(jù)一般是熱點(diǎn)數(shù)據(jù) ,由于緩存過期,會同時(shí)訪問數(shù)據(jù)庫來查詢最新數(shù)據(jù),并且回寫緩存,會導(dǎo)使數(shù)據(jù)庫瞬間壓力過大。

解決方案

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

從緩存層面來看,沒有設(shè)置過期時(shí)間,所以不會出現(xiàn)熱點(diǎn)key過期后產(chǎn)生的問題。

加互斥鎖

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

緩存雪崩

緩存雪崩,是指在某-一個(gè)時(shí)間段,緩存集中過期失效。Redis 宕機(jī)!
產(chǎn)生雪崩的原因之一,比如在寫本文的時(shí)候,馬上就要到雙十二零點(diǎn),很快就會迎來一波搶購,這波商品時(shí)間比較集中的放入了緩存,假設(shè)緩存一個(gè)小時(shí)。 那么到了凌晨一點(diǎn)鐘的時(shí)候,這批商品的緩存就都過期了。而對這批商品的訪問查詢,都落到了數(shù)據(jù)庫上,對于數(shù)據(jù)庫而言,就會產(chǎn)生周期性的壓力波峰。于是所有的請求都會達(dá)到存儲層,存儲層的調(diào)用量會暴增,造成存儲層也會掛掉的情況。


緩存雪崩

其實(shí)集中過期,倒不是非常致命,比較致命的緩存雪崩,是緩存服務(wù)器某個(gè)節(jié)點(diǎn)宕機(jī)或斷網(wǎng)。因?yàn)樽匀恍纬傻木彺嫜┍?,一定是在某個(gè)時(shí)間段集中創(chuàng)建緩存,這個(gè)時(shí)候,數(shù)據(jù)庫也是可以頂住壓力的。無非就是對數(shù)據(jù)庫產(chǎn)生周期性的壓力而已。而緩存服務(wù)節(jié)點(diǎn)的宕機(jī),對數(shù)據(jù)庫服務(wù)器造成的壓力是不可預(yù)知的,很有可能瞬間就把數(shù)據(jù)庫壓垮。

解決方案

redis高可用

這個(gè)思想的含義是,既然redis有可能掛掉,那我多增設(shè)幾臺redis ,這樣一-臺掛掉之 后其他的還可以繼續(xù)工作,其實(shí)就是搭建的集群。

限流降級

這個(gè)解決方案的思想是,在緩存失效后,通過加鎖或者隊(duì)列來控制讀數(shù)據(jù)庫寫緩存的線程數(shù)量。比如對某個(gè)key只允許一個(gè)線程查詢數(shù)據(jù)和寫緩存,其他線程等待。

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

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

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

相關(guān)閱讀更多精彩內(nèi)容

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