快取穿透
快取穿透是指客戶端的請求資料在快取和資料庫中都不存在,這樣快取永遠不會生效,這些請求都會到達資料庫,從而導致資料庫負載過高。
常見解決方案有兩種:
- 快取空物件:實現簡單、方便維護,是解決快取穿透的首選方法,但會造成額外記憶體消耗,或短期的資料不一致
- 布隆過濾:記憶體佔用少,沒有多餘key,但實現複雜且有可能誤判
快取雪崩
快取雪崩是指在同一時間段大量快取 key 同時失效或 Redis 服務當機,導致大量請求到達資料庫,導致資料庫負載過高。
常見解決方案如下:
- 給不同的 key 的過期時間新增隨機值
- 利用 Redis 叢集提高服務的可用性
- 給快取業務新增限流降級策略
- 給業務新增多級快取
快取擊穿
快取擊穿也叫熱點 key 問題,就是一個被高併發訪問並且快取重建業務比較複雜的 key 突然失效了,無數的請求訪問會在瞬間給資料庫帶來巨大的衝擊。
常見解決方案有以下兩種:
互斥鎖
給重建快取的邏輯加上一個互斥鎖,避免多個執行緒同時訪問資料庫,這種方法通常應用在一致性要求較高的場景。
邏輯過期
在快取物件中維護一個過期時間的欄位,當查詢快取時發現已過期則獲取互斥鎖(例如 Redis 中的 setnx)並開啟一個新執行緒重建快取資料並將釋放互斥鎖的邏輯放在新執行緒中,原執行緒返回過期資料。當在快取重建時有其他執行緒訪問快取並發現資料過期時獲取互斥鎖失敗則直接返回過期資料。這種方法通常應用在對可用性較高的場景。