緩存擊穿:(針對某個數據)
問題描述:用戶請求不存在的key,緩存中不存在,請求會繞過緩存直接查詢數據庫導致性能下降,如果用戶惡意多次請求不存在的key,就會有性能問題,導致後臺崩潰。
解決方式:
1,查詢DB的時候使用 互斥鎖
2,設置默認值,空值如設置成“NULL”。
3,使用BloomFilter,用於驗證哪些查詢有數據,有數據再查詢DB,也是爲了解決空值問題。
緩存雪崩:(針對批量數據)
問題描述:緩存失效期間請求將會去查詢數據庫,從而對數據庫CPU和內存造成巨大壓力,嚴重將造成整個系統的崩潰,如果某臺緩存節點掛了,或者大批數據緩存失效了,就會導致此問題出現。
解決方式:
1,加鎖排隊,避免大量線程讀寫數據庫。
2,緩存失效時間,加上一定隨機數,防止同時失效。
3,緩存備份,如果緩存失效,則從備份緩存讀取,備份緩存與主緩存失效時間不一樣,甚至設置不失效,當主緩存失效後,去備份查,並通知另外的線程異步去更新緩存。
4,緩存失效時間設置爲真實失效時間的兩倍,檢測到失效後,先返回緩存的值,並通知另外的線程異步更新緩存。(其實是方法3的另一種方式)