redis面試篇-01一文搞懂雪崩、穿透、擊穿、預(yù)熱
你知道什么是緩存雪崩嗎?你知道什么是緩存穿透嗎?你知道redis的持久化機制是什么嗎?redis作為緩存數(shù)據(jù)庫在項目中大量使用,在面試時,被問到的幾率也非常高頻。今天,我就帶大家從這幾個問題出發(fā),了解下redis。
1.什么是緩存雪崩?
日常開發(fā)中,為了節(jié)省內(nèi)存空間,redis的key值會設(shè)置過期時間。一旦大量的redis緩存過期,所有的請求全部懟到數(shù)據(jù)庫(mysql默認最大連接數(shù),看版本),就會把數(shù)據(jù)庫搞掛掉(如下圖所示),這就是緩存雪崩。

怎么解決緩存雪崩呢?
1.設(shè)置熱點數(shù)據(jù)永不過期
2.數(shù)據(jù)訪問加互斥鎖,每次只允許一個用戶訪問

3.緩存降級策略,比如:redis緩存失效,還有本地緩存,本地緩存之后才是mysql
4.緩存失效時間分散化,防止集中失效:
將緩存的key值先羅列到紙上,然后對key值時間進行規(guī)劃,分散開來
將緩存的key值失效時間,加上一個隨機數(shù),進行分散。
2.什么是緩存穿透?
如果一個key值,它在redis與數(shù)據(jù)庫都不存在時,如果一個黑客利用這個key值,進行高并發(fā)訪問,就會搞垮數(shù)據(jù)庫,稱為緩存穿透。

1.當(dāng)這個key值不存在時,先臨時將null或者空字符寫入到redis中,過期時間設(shè)置的短一些,幾分鐘以內(nèi)。
2.將數(shù)據(jù)庫所有的結(jié)果放到布隆過濾器里,布隆過濾器結(jié)果只存0與1,當(dāng)0時,代表數(shù)據(jù)庫沒有數(shù)據(jù)。直接拒絕查詢。
3.什么是緩存擊穿?
當(dāng)一個key值過期時,請求激增,大量的請求把數(shù)據(jù)庫搞垮。
怎么解決緩存擊穿?
1.熱點數(shù)據(jù)設(shè)置永不過期
2.從數(shù)據(jù)庫讀取key值并更新到緩存使用排它鎖,同一時間只允許一個線程操作。其他線程進入睡眠狀態(tài),被喚醒獲取到鎖后,先檢測緩存是否有數(shù)據(jù),有數(shù)據(jù)直接返回。
4.什么是緩存預(yù)熱
就是系統(tǒng)上線后手動去加載數(shù)據(jù)到緩存中,避免等客戶請求時,再去加載數(shù)據(jù)
解決辦法:
1.寫個緩存刷新頁面,手工操作
2.定時任務(wù)去刷新緩存
3.數(shù)據(jù)量不大的情況可以在系統(tǒng)啟動時,直接加載
5.緩存淘汰策略有哪些
redis緩存淘汰策略可以分為如下:
1.定時清理過期的緩存
2.用戶請求過來時,判斷緩存是否過期,過期就從源數(shù)據(jù)取數(shù)據(jù)并更新緩存