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