Redis中的快取雪崩、快取擊穿、快取穿透問題

2023-10-18 12:00:25

1. 什麼是快取雪崩

當我們提到快取系統中的問題,快取雪崩是一個經常被討論的話題。快取雪崩是指在某一時刻發生大量的快取失效,導致瞬間大量的請求直接打到了資料庫,可能會導致資料庫瞬間壓力過大甚至宕機。尤其在高並行的系統中,這種情況會導致連鎖反應,整個系統可能會崩潰。

1.1 快取雪崩的成因

  1. 大量快取同時設定相同的過期時間:如果在某一時刻設定了大量的快取資料,併為它們都設定了相同的過期時間,那麼在未來的某一時刻,這些快取資料都會同時失效。
  2. Redis宕機:如果因為某種原因,Redis伺服器突然宕機,那麼所有的快取資料都會消失,導致所有的請求都直接存取資料庫。
  3. 誤刪快取資料:如果由於某種原因,大量的快取資料被誤刪除,那麼也會引發快取雪崩。

1.2 如何預防快取雪崩

  1. 設定隨機過期時間:為了防止大量的快取同時失效,我們可以為每個快取設定一個隨機的過期時間,這樣就可以確保不會有太多的快取同時失效。
  2. 使用熔斷機制:在系統中加入熔斷機制,當資料庫請求到達一定的閾值時,直接拒絕部分請求,以保護資料庫不被過度存取。
  3. 雙層快取策略:可以使用兩層快取,一層是熱資料的快取,另一層是冷資料的快取。熱資料快取失效後,可以先存取冷資料快取,而不是直接存取資料庫。
  4. 資料預熱:在系統啟動後,預先載入部分常用的資料到快取中,減少在高峰期的資料庫存取。
  5. 使用高可用架構:如使用Redis的哨兵模式或者叢集模式,確保Redis服務的高可用。
  6. 備份和恢復策略:定期備份Redis資料,並確保在Redis宕機後,可以快速恢復資料。

2. 什麼是快取穿透?

在使用快取的應用程式中,快取穿透是一種指請求查詢一個不存在的資料,由於快取層不存在這個資料,所以請求會穿過快取層直接查詢資料庫,導致資料庫壓力增加。快取穿透通常發生在惡意攻擊或者系統設計不當的情況下。

2.1 導致快取穿透的原因

  1. 惡意攻擊:攻擊者有意請求不存在的資料,以使得系統頻繁存取資料庫,造成拒絕服務攻擊。
  2. 大量請求:如果一個不存在的熱點資料被大量請求,會導致這些請求穿透快取層直接存取資料庫,增加資料庫壓力。
  3. 快取資料失效不及時:當快取中的資料未及時更新或失效,而恰好有大量請求存取這部分失效的資料時,也會導致快取穿透問題。

2.2 緩解快取穿透的方法

  1. 布隆過濾器:在快取層前使用布隆過濾器,對所有可能的資料建立一個布隆過濾器,用於快速判斷一個請求的資料是否存在於資料庫中。
  2. 空結果快取:對於資料庫中不存在的資料,也將其快取起來,但設定一個較短的過期時間,避免大量的無效請求直接存取資料庫。
  3. 合理設定快取時間:根據業務場景,合理設定快取時間,避免快取資料過早失效導致大量請求穿透。

3. 什麼是快取擊穿?

快取擊穿是指在高並行環境下,大量請求同時存取快取中不存在的資料,導致這些請求穿透到資料庫。這會對資料庫造成嚴重的壓力,降低效能。

3.1 快取穿透與快取擊穿的區別

  • 快取穿透 是指請求一個不存在於快取中的資料,導致每次請求都直接查詢資料庫。
  • 快取擊穿 是指大量請求同時請求一個不存在於快取中的資料,導致資料庫壓力驟增。

3.2 快取擊穿的原因

快取擊穿通常發生在以下情況下:

  • 熱點資料:某個資料非常熱門,但快取中沒有。
  • 快取失效:快取中的資料過期,但大量請求仍在存取。
  • 同時到期:多個資料同時過期,導致並行查詢資料庫。

3.3. 解決快取擊穿問題

  • 使用互斥鎖: 通過在快取中設定互斥鎖,只允許一個執行緒查詢資料庫,其他執行緒等待結果。這可以防止多個請求同時穿透到資料庫。
  • 預載入資料: 在快取中設定資料預載入,避免等待請求引發快取擊穿。這需要定期重新整理快取,確保熱門資料始終可用。
  • 布隆過濾器: 使用布隆過濾器檢查請求的資料是否存在於快取中,如果不存在,不查詢資料庫。這可以減少資料庫查詢次數。
  • 優化資料庫查詢: 優化資料庫查詢效能,減少查詢時間,可以降低快取擊穿的風險。使用合適的索引和查詢優化策略。

孟斯特

宣告:本作品採用署名-非商業性使用-相同方式共用 4.0 國際 (CC BY-NC-SA 4.0)進行許可,使用時請註明出處。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 戀水無意