Redis緩存中【緩存穿透、緩存擊穿、緩存雪崩】解決方案
1.前言
當(dāng)我們設(shè)計一個Redis緩存服務(wù)時,緩存穿透、緩存擊穿、緩存雪崩這三大問題我們不得不考慮。同時參見面試時面試官也會常問這三大問題。本章我們來分析一下這三大問題。
2.緩存穿透
2.1什么叫緩存穿透?
正常情況下,查詢數(shù)據(jù)無論在緩存中或者數(shù)據(jù)庫中,都應(yīng)該有這樣的數(shù)據(jù)。但如果這個數(shù)據(jù)在緩存和數(shù)據(jù)庫都?不存在?,那么用戶高并發(fā)環(huán)境下訪問?數(shù)據(jù)庫?和?緩存?中都?不存在的數(shù)據(jù)?稱之為緩存穿透現(xiàn)象.

2.2穿透帶來的問題
如果有些不懷好意的人,利用這個不存在的數(shù)據(jù),頻繁大量的訪問你的數(shù)據(jù)庫,產(chǎn)生大量的請求,極有可能導(dǎo)致你的數(shù)據(jù)庫異常訪問不了、數(shù)據(jù)庫宕掉。
2.3解決方案
1). 禁用IP 限制IP訪問.
2). 限流 每秒最多訪問3次
3).?布隆過濾器?(常見解決方案)
4).?緩存空值?(簡單粗暴)
布隆過濾器
布隆過濾器(Bloom Filter)是1970年由布隆提出的。它實際上是一個?很長的二進(jìn)制向量和一系列隨機(jī)映射函數(shù)?。布隆過濾器可以?用于檢索一個元素是否在一個集合中?。它的優(yōu)點是空間效率和查詢時間都比一般的算法要好的多,缺點是有一定的誤識別率和刪除困難。
原理

缺點:
由于?hash碰撞問題?,可能由多個key有相同的位置,所以得出結(jié)論,布隆過濾器認(rèn)為數(shù)據(jù)存在,那么數(shù)據(jù)可能存在.如果布隆過濾器認(rèn)為數(shù)據(jù)不存在,則數(shù)據(jù)一定不在.
解決方案
1.擴(kuò)容二進(jìn)制向量位數(shù).
2.增加hash函數(shù)的個數(shù)
當(dāng)位數(shù)增加/函數(shù)適當(dāng)增加,則可以有效的降低hash碰撞的幾率. 默認(rèn)值 0.03

緩存空值
這個方案簡單粗暴,就是拿到這些不存在數(shù)據(jù)key,并把value設(shè)置成null放到緩存中去,后面再請求這樣的數(shù)據(jù)直接到緩存查詢,返回給它null就可以了,切記也要給這些不存在數(shù)據(jù)的key設(shè)置失效時間。
3.緩存擊穿
3.1什么叫緩存擊穿?
在高并發(fā)的環(huán)境下,大量請求同時請求同一個key,如果恰巧這個時候key失效了。那么當(dāng)某個熱點數(shù)據(jù)在緩存中?突然失效?.導(dǎo)致大量的用戶直接訪問數(shù)據(jù)庫.導(dǎo)致并發(fā)壓力過高造成異常這個現(xiàn)象被稱為?緩存擊穿
3.2擊穿帶來的問題
造成某個時刻所有訪問直接打在數(shù)據(jù)庫上,導(dǎo)致數(shù)據(jù)庫壓力劇增
3.3解決方案
1.盡可能將熱點數(shù)據(jù)的超時時間 設(shè)定的長一點
2.設(shè)定多級緩存 超時時間采用隨機(jī)算法.
4.緩存雪崩
4.1什么叫緩存雪崩?
在緩存服務(wù)器中,由于大量的緩存數(shù)據(jù)失效,導(dǎo)致用戶訪問的命中率過低.導(dǎo)致直接訪問數(shù)據(jù)庫.例如緩存服務(wù)宕機(jī),然后大量請求直接訪問數(shù)據(jù)庫,極有導(dǎo)致數(shù)據(jù)庫也宕機(jī).
4.2雪崩帶來的問題
導(dǎo)致緩存、數(shù)據(jù)庫等一系列服務(wù)宕機(jī)..
4.3解決方案
使用集群緩存,保證緩存服務(wù)的高可用
設(shè)定超時時間時,應(yīng)該采用隨機(jī)算法

騰訊、阿里、滴滴后臺面試題匯總總結(jié) — (含答案)
面試:史上最全多線程面試題 !
最新阿里內(nèi)推Java后端面試題
JVM難學(xué)?那是因為你沒認(rèn)真看完這篇文章

關(guān)注作者微信公眾號 —《JAVA爛豬皮》
了解更多java后端架構(gòu)知識以及最新面試寶典


看完本文記得給作者點贊+在看哦~~~大家的支持,是作者源源不斷出文的動力
