定義:
1:緩存穿透:
在redis中丈咐,key對(duì)應(yīng)的值并不存在,每次去到redis緩存中查詢數(shù)據(jù)都得不到結(jié)果龙宏,一般業(yè)務(wù)邏輯中就會(huì)去數(shù)據(jù)庫(kù)查詢棵逊,這種漏洞就可能會(huì)被人利用直接攻擊數(shù)據(jù)庫(kù)。例子:獲取用戶信息接口中银酗,某人利用一個(gè)根本不存在的用戶id進(jìn)行大批量的請(qǐng)求辆影,每一個(gè)請(qǐng)求都會(huì)到達(dá)數(shù)據(jù)庫(kù),就可能壓垮數(shù)據(jù)庫(kù)黍特。
2:緩存擊穿:
Redis中key對(duì)應(yīng)的數(shù)據(jù)存在蛙讥,但是已經(jīng)過(guò)期了,這時(shí)候會(huì)去請(qǐng)求數(shù)據(jù)庫(kù)灭衷,重置緩存次慢,如果此時(shí)有大批量請(qǐng)求,也是直達(dá)數(shù)據(jù)庫(kù)翔曲,也有可能壓垮數(shù)據(jù)庫(kù)经备。
3:緩存雪崩:
當(dāng)緩存服務(wù)器重啟或者同時(shí)大批量的緩存過(guò)期的時(shí)候,這時(shí)候也是有數(shù)據(jù)庫(kù)扛不住壓力的風(fēng)險(xiǎn)的部默。
解決方案
1.1:緩存穿透解決方案一
使用布隆過(guò)濾器侵蒙。將所有可能存在的數(shù)據(jù)哈希存儲(chǔ)到一個(gè)足夠大的bitmap中,進(jìn)行數(shù)據(jù)查詢時(shí)傅蹂,先進(jìn)行bitmap的過(guò)濾纷闺,從而避免對(duì)底層存儲(chǔ)系統(tǒng)的查詢壓力算凿。
1.2:緩存穿透解決方案二
將查詢不到的數(shù)據(jù),也做空值的緩存犁功,過(guò)期時(shí)間可以設(shè)置短一點(diǎn)氓轰,3-5分鐘這樣。
2.1:緩存擊穿解決方案
使用互斥鎖浸卦。就是在緩存失效的時(shí)候署鸡,判斷取出的值是不是為空,如果為空限嫌,不是立即去查詢數(shù)據(jù)庫(kù)靴庆,而是先使用緩存工具的某些帶成功操作返回值的操作(比如Redis的SETNX或者M(jìn)emcache的ADD)去設(shè)置一個(gè)mutex key,當(dāng)操作返回成功時(shí)怒医,再查詢數(shù)據(jù)庫(kù)并回設(shè)緩存炉抒;否則,就重試整個(gè)get緩存的方法稚叹。
注:SETNX焰薄,是「SET if Not eXists」的縮寫(xiě),也就是只有不存在的時(shí)候才設(shè)置扒袖,可以利用它來(lái)實(shí)現(xiàn)鎖的效果塞茅。
3.1:緩存雪崩解決方案
針對(duì)服務(wù)器重啟這種,設(shè)置雙緩存方案季率,也就是備份緩存凡桥,主緩存時(shí)間短,備份緩存時(shí)間長(zhǎng)蚀同,做高可用緩存服務(wù)器缅刽,主服務(wù)器宕機(jī)及時(shí)切換到備份服務(wù)器。
針對(duì)大批量數(shù)據(jù)同時(shí)失效的問(wèn)題蠢络,可以在設(shè)置失效時(shí)長(zhǎng)的時(shí)候設(shè)置隨機(jī)數(shù)衰猛。