Redis系列 - 快取雪崩、擊穿、穿透及解決方案

買個發表於2020-11-16

Redis系列 - 快取雪崩、擊穿、穿透及解決方案

快取雪崩、快取擊穿和快取穿透一旦發生,會導致大量的請求積壓到資料庫層。如果請求的併發量很大,就會導致資料庫當機或是故障,這就是很嚴重的生產事故了。

快取雪崩

快取雪崩是指快取中資料大批量到過期時間,而查詢資料量巨大,引起資料庫壓力過大甚至當機。

快取雪崩一般是由兩個原因導致的

  • 快取大面積失效
  • Redis 快取例項發生故障當機了,無法處理請求,這就會導致大量請求一下子打到資料庫層

解決方案

  • 快取資料的過期時間設定隨機值(例如,隨機增加1~5分鐘),防止同一時間大量資料過期現象發生。
  • 事前:redis高可用,主從+哨兵+redis cluster,避免全盤崩潰
  • 事中:本地cache快取 + 限流&降級,避免MySQL被打爆
  • 事後:redis持久化RDB+AOF,快速恢復快取資料

快取擊穿

快取擊穿是指,針對某個訪問非常頻繁的熱點資料的請求,無法在快取中進行處理,緊接著,訪問該資料的大量請求,一下子都傳送到了後端資料庫,導致了資料庫壓力激增,會影響資料庫處理其他請求。快取擊穿的情況,經常發生在熱點資料過期失效時。

解決方案

  • 設定熱點資料永遠不過期。
  • 加互斥鎖,當從快取中獲取資料失敗時,去資料庫獲取資料的程式碼片段加互斥鎖

快取穿透

快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷髮起請求,如發起為id為“-1”的資料或id為特別大不存在的資料。這時的使用者很可能是攻擊者,攻擊會導致資料庫壓力過大。

產生的常見原因有下面兩個:

  • 業務層誤操作:快取中的資料和資料庫中的資料被誤刪除了,所以快取和資料庫中都沒有資料
  • 惡意攻擊:攻擊者惡意訪問資料庫中沒有的資料

解決方案

  • 快取空值或預設值
  • 使用布隆過濾器快速判斷資料是否存在,避免從資料庫中查詢資料是否存在,減輕資料庫壓力

 

相關文章