App下載

能否說(shuō)下緩存擊穿、穿透、雪崩的區(qū)別?

海氹有點(diǎn)甜 2021-12-15 14:11:51 瀏覽數(shù) (2236)
反饋

緩存擊穿 (某個(gè)熱點(diǎn)key緩存失效了)
緩存中沒(méi)有但數(shù)據(jù)庫(kù)中有的數(shù)據(jù),假如是熱點(diǎn)數(shù)據(jù),那key在緩存過(guò)期的一刻,同時(shí)有大量的請(qǐng)求,這些請(qǐng)求都會(huì)擊穿到DB,造成瞬時(shí)DB請(qǐng)求量大、壓力增大。

和緩存雪崩的區(qū)別在于這里針對(duì)某一key緩存,后者則是很多key。
預(yù)防:設(shè)置熱點(diǎn)數(shù)據(jù)不過(guò)期,定時(shí)任務(wù)定時(shí)更新緩存,或者設(shè)置互斥鎖。


緩存穿透(查詢不存在數(shù)據(jù))
查詢一個(gè)不存在的數(shù)據(jù),由于緩存是不命中的,并且出于容錯(cuò)考慮,如發(fā)起為id為“-1”不存在
的數(shù)據(jù)如果從存儲(chǔ)層查不到數(shù)據(jù)則不寫(xiě)入緩存這將導(dǎo)致這個(gè)不存在的數(shù)據(jù)每次請(qǐng)求都要到存儲(chǔ)層去
查詢,失去了緩存的意義。存在大量查詢不存在的數(shù)據(jù),可能DB就掛掉了,這也是黑客利用不存在的key頻繁攻擊應(yīng)用的一種方式。
預(yù)防:接口層增加校驗(yàn),數(shù)據(jù)合理性校驗(yàn),緩存取不到的數(shù)據(jù),在數(shù)據(jù)庫(kù)中也沒(méi)有取到,這時(shí)也可以將key-value對(duì)寫(xiě)為key-null,設(shè)置短點(diǎn)的過(guò)期時(shí)間,防止同個(gè)key被一直攻擊。


緩存雪崩 (多個(gè)熱點(diǎn)key都過(guò)期)
大量的key設(shè)置了相同的過(guò)期時(shí)間,導(dǎo)致在緩存在同一時(shí)刻全部失效,造成瞬時(shí)DB請(qǐng)求量大、壓力驟增,引起雪崩
預(yù)防:存數(shù)據(jù)的過(guò)期時(shí)間設(shè)置隨機(jī),防止同一時(shí)間大量數(shù)據(jù)過(guò)期現(xiàn)象發(fā)生,設(shè)置熱點(diǎn)數(shù)據(jù)永遠(yuǎn)不過(guò)期,定時(shí)任務(wù)定時(shí)更新。


0 人點(diǎn)贊