緩存雪崩是指在緩存中的大量數據在同一個時刻全部過期,導致原本這些可以由緩存中間件處理的高併發請求,一下子全部打到資料庫,導致資料庫伺服器崩潰的一種現象。那麼出現緩存雪崩的原因可以有①:緩存中間件宕機。②:緩存中大部分key都設置了相同的時間,導致這些key在同一時間內全部失效。解決的方法: ①:可以 ...
緩存雪崩是指在緩存中的大量數據在同一個時刻全部過期,導致原本這些可以由緩存中間件處理的高併發請求,一下子全部打到資料庫,導致資料庫伺服器崩潰的一種現象。那麼出現緩存雪崩的原因可以有①:緩存中間件宕機。②:緩存中大部分key都設置了相同的時間,導致這些key在同一時間內全部失效。解決的方法:
①:可以對這些個key設置可以失效的隨機值,避免同時失效的問題。
②:還可以對資料庫的讀寫加鎖,不讓那麼瞬時高併發的請求一下子突然打到資料庫上。
③:即使如果真的發生了緩存雪崩,使用資料庫的主從複製、雙主、讀寫分離等策略,資料庫本身的容災能力應該還是可以承受住的。
緩存穿透是指緩存穿透是指在使用緩存系統的應用程式中,惡意請求或者無效的請求頻繁地訪問緩存中不存在的數據,導致大量請求直接訪問後端資料庫或服務,而繞過了緩存系統的情況。可能出現的原因其實是可出現了惡意攻擊行為。對於一個成熟的系統來說,由於緩存預熱的不斷載入,即便是出現了一個不存在的key,影響也不會很大,那麼惡意攻擊行為可能具有持久性,確認這個key在資料庫中不存在,才會達到這樣一個行為。解決的方法:
①:把這些無效的key保存到Redis裡面,並設置一個null的特殊值,這樣就不會去查資料庫了。但是如果攻擊者一直惡意攻擊同樣會出現相同的問題。
②:使用布隆過濾器來實現。把這些數據全部放到布隆過濾器裡面,當進行查詢時,先到布隆過濾器裡面進行查詢,如果查詢不存在,那麼這個key在資料庫中肯定也不會存在,那麼就不會去訪問資料庫了。
③:緩存預熱,預先載入熱點數據到緩存中,避免在某些特定時刻,高併發的請求打到資料庫上。
緩存擊穿是指當某個熱點數據過期或被主動移除時,大量的併發請求同時訪問該資料庫,導致緩存無法命中,進而直接訪問資料庫或後端服務。對應的解決方案:
①:設置熱點數據的永不過期策略:對於一些非常熱點且不經常變動的數據,可以將其緩存設置為永不過期,確保數據一直存在於緩存中,避免了過期導致的擊穿問題。
②:延遲緩存更新策略(緩存穿透):當發現某個緩存鍵對應的數據不存在時,可以採取一定的策略,如先訪問資料庫或後端服務獲取數據,然後將數據寫入緩存,避免了多個併發請求同時訪問資料庫。
③:布隆過濾器(Bloom Filter):布隆過濾器可以用於快速判斷某個鍵是否存在於緩存中,如果布隆過濾器判斷鍵不存在,則不會進一步訪問緩存或資料庫,從而減輕了緩存擊穿的壓力。
④:緩存預熱(Cache Pre-warming):在系統啟動或低峰期,預先載入熱點數據到緩存中,使其在高峰期可用,從而避免了高併發請求直接訪問資料庫。
這裡只列出來一小部分方案