1. 程式人生 > 其它 >快取常見問題及解決方案

快取常見問題及解決方案

CacheProblems

快取穿透

快取穿透: 大量的請求都是快取和資料庫中不存在的資料, 導致每次請求都會到達資料庫, 從而壓垮資料庫。

解決方案

  1. 業務層引數校驗, 過濾掉無效的請求
  2. 將查詢結果為空的請求也進行快取, 但是快取時間要短, 從而在快取層面攔截掉一部分請求
  3. 布隆過濾器

快取擊穿

快取擊穿: 在某個熱點資料失效的同時, 大量的請求湧進資料庫, 從而導致資料庫宕機。

解決方案

  1. 熱點資料不設定過期時間, 一直儲存在快取中
  2. 定時更新熱點資料, 在資料失效前重新整理資料, 從而延長熱點資料的有效期
  3. 使用互斥鎖, 當某個執行緒獲取到快取資料為空時, 對該資料新增讀鎖, 然後去請求資料庫, 從而實現只有一個請求到達資料庫

快取雪崩

快取雪崩: 快取中的大量資料同時失效, 或快取伺服器宕機, 導致大量請求湧進資料庫, 從而導致資料庫宕機。

解決方案

  1. 儘量避免快取資料同時失效, 在設定資料有效期上增加隨機值, 或使資料有效期均勻分佈
  2. 後端實現請求限流, 避免大量請求湧入資料庫
  3. 使用 Redis 的哨兵模式或 Redis 叢集, 保證快取伺服器的高可用性

布隆過濾器

原理: 布隆過濾器是採用 BitMap 來實現的, 大致原理是: 將系統中所有存在的 key 經過 hash 執行後放入 bitmap, 在查詢之前先通過 bitmap 過濾掉一定不存在的 key。

缺點是: 因為有 hash 衝突的問題, 所以通過布隆過濾器的資料也有可能是系統中不存在的 key, 但是沒有通過布隆過濾器的 key 一定是系統中不存在的。