緩存擊穿 (某個熱點key緩存失效了)
緩存中沒有但數(shù)據(jù)庫中有的數(shù)據(jù),假如是熱點數(shù)據(jù),那key在緩存過期的一刻,同時有大量的請求,這些請求都會擊穿到DB,造成瞬時DB請求量大、壓力增大。
和緩存雪崩的區(qū)別在于這里針對某一key緩存,后者則是很多key。
預(yù)防:設(shè)置熱點數(shù)據(jù)不過期,定時任務(wù)定時更新緩存,或者設(shè)置互斥鎖。
緩存穿透(查詢不存在數(shù)據(jù))
查詢一個不存在的數(shù)據(jù),由于緩存是不命中的,并且出于容錯考慮,如發(fā)起為id為“-1”不存在
的數(shù)據(jù)如果從存儲層查不到數(shù)據(jù)則不寫入緩存這將導(dǎo)致這個不存在的數(shù)據(jù)每次請求都要到存儲層去
查詢,失去了緩存的意義。存在大量查詢不存在的數(shù)據(jù),可能DB就掛掉了,這也是黑客利用不存在的key頻繁攻擊應(yīng)用的一種方式。
預(yù)防:接口層增加校驗,數(shù)據(jù)合理性校驗,緩存取不到的數(shù)據(jù),在數(shù)據(jù)庫中也沒有取到,這時也可以將key-value對寫為key-null,設(shè)置短點的過期時間,防止同個key被一直攻擊。
緩存雪崩 (多個熱點key都過期)
大量的key設(shè)置了相同的過期時間,導(dǎo)致在緩存在同一時刻全部失效,造成瞬時DB請求量大、壓力驟增,引起雪崩
預(yù)防:存數(shù)據(jù)的過期時間設(shè)置隨機(jī),防止同一時間大量數(shù)據(jù)過期現(xiàn)象發(fā)生,設(shè)置熱點數(shù)據(jù)永遠(yuǎn)不過期,定時任務(wù)定時更新。