redis——缓存击穿/穿透/雪崩
緩存穿透
一般的緩存系統(tǒng),都是按照key去緩存查詢,如果不存在對(duì)應(yīng)的value,就去后端系統(tǒng)查找(比如DB)。
一些惡意的請(qǐng)求會(huì)故意查詢不存在的key,請(qǐng)求量很大,就會(huì)對(duì)后端系統(tǒng)造成很大的壓力。這就叫做緩存穿透。
?
如何避免?
1:對(duì)查詢結(jié)果為空的情況也進(jìn)行緩存,這樣,再次訪問時(shí),緩存層會(huì)直接返回空值。緩存時(shí)間設(shè)置短一點(diǎn),或者該key對(duì)應(yīng)的數(shù)據(jù)insert了之后清理緩存。
2:對(duì)一定不存在的key進(jìn)行過濾。具體請(qǐng)看布隆過濾器
緩存擊穿
是針對(duì)緩存中沒有但數(shù)據(jù)庫有的數(shù)據(jù)。
場景是,當(dāng)Key失效后,假如瞬間突然涌入大量的請(qǐng)求,來請(qǐng)求同一個(gè)Key,這些請(qǐng)求不會(huì)命中Redis,都會(huì)請(qǐng)求到DB,導(dǎo)致數(shù)據(jù)庫壓力過大,甚至扛不住,掛掉。
解決辦法
1、設(shè)置熱點(diǎn)Key,自動(dòng)檢測(cè)熱點(diǎn)Key,將熱點(diǎn)Key的過期時(shí)間加大或者設(shè)置為永不過期,或者設(shè)置為邏輯上永不過期
2、加互斥鎖。當(dāng)發(fā)現(xiàn)沒有命中Redis,去查數(shù)據(jù)庫的時(shí)候,在執(zhí)行更新緩存的操作上加鎖,當(dāng)一個(gè)線程訪問時(shí),其它線程等待,這個(gè)線程訪問過后,緩存中的數(shù)據(jù)會(huì)被重建,這樣其他線程就可以從緩存中取值。
緩存雪崩
是指大量Key同時(shí)失效,對(duì)這些Key的請(qǐng)求又會(huì)打到DB上,同樣會(huì)導(dǎo)致數(shù)據(jù)庫壓力過大甚至掛掉。
解決辦法
1)讓Key的失效時(shí)間分散開,可以在統(tǒng)一的失效時(shí)間上再加一個(gè)隨機(jī)值,或者使用更高級(jí)的算法分散失效時(shí)間。
2)構(gòu)建多個(gè)redis實(shí)例,個(gè)別節(jié)點(diǎn)掛了還有別的可以用。
3)多級(jí)緩存:比如增加本地緩存,減小redis壓力。
4)對(duì)存儲(chǔ)層增加限流措施,當(dāng)請(qǐng)求超出限制,提供降級(jí)服務(wù)(一般就是返回錯(cuò)誤即可)
?
總結(jié)
以上是生活随笔為你收集整理的redis——缓存击穿/穿透/雪崩的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第二次作业 讲解及展示
- 下一篇: redis——sentinel