首先我們來說說緩存擊穿(某個(gè)熱點(diǎn)key緩存失效了)
緩存中沒有但是數(shù)據(jù)庫(kù)有的數(shù)據(jù)霹肝,假如是熱點(diǎn)數(shù)據(jù)估蹄,那key在緩存過期的一刻,同時(shí)有大量的請(qǐng)求沫换,這些請(qǐng)求都會(huì)擊穿DB臭蚁,造成瞬時(shí)DB請(qǐng)求量大,壓力增大讯赏。
和緩存雪崩的區(qū)別在于這里是針對(duì)某一key緩存垮兑,前者是很多key
預(yù)防:設(shè)置熱點(diǎn)數(shù)據(jù)不過期,定時(shí)任務(wù)定時(shí)更新緩存漱挎,或者設(shè)置互斥鎖系枪。
緩存穿透(查詢不存在的數(shù)據(jù))
查詢一個(gè)不存在的數(shù)據(jù),由于緩存是不命中的磕谅,并且出于容錯(cuò)考慮私爷。例如發(fā)起一個(gè)id為-1不存在的數(shù)據(jù)
如果從存儲(chǔ)層查不到數(shù)據(jù)則不寫入緩存雾棺,這將導(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ù)中也沒有取到拓诸,這時(shí)可以將key-value設(shè)置為key-null侵佃,設(shè)置短點(diǎn)的過期時(shí)間,防止同一個(gè)key被一直攻擊
緩存雪崩(多個(gè)熱點(diǎn)key都過期)
大量的key設(shè)置了相同的過期時(shí)間奠支,導(dǎo)致緩存在同一時(shí)刻全部失效馋辈,造成瞬時(shí)DB請(qǐng)求量大,壓力驟增倍谜,引起雪崩
預(yù)防:存數(shù)據(jù)的過期時(shí)間設(shè)置隨機(jī)迈螟,防止同一時(shí)間大量過期現(xiàn)象發(fā)生,設(shè)置熱點(diǎn)數(shù)據(jù)永遠(yuǎn)不過期尔崔,定時(shí)任務(wù)定時(shí)更新