快取常見問題及解決方案
阿新 • • 發佈:2021-10-30
CacheProblems
快取穿透
快取穿透: 大量的請求都是快取和資料庫中不存在的資料, 導致每次請求都會到達資料庫, 從而壓垮資料庫。
解決方案
- 業務層引數校驗, 過濾掉無效的請求
- 將查詢結果為空的請求也進行快取, 但是快取時間要短, 從而在快取層面攔截掉一部分請求
- 布隆過濾器
快取擊穿
快取擊穿: 在某個熱點資料失效的同時, 大量的請求湧進資料庫, 從而導致資料庫宕機。
解決方案
- 熱點資料不設定過期時間, 一直儲存在快取中
- 定時更新熱點資料, 在資料失效前重新整理資料, 從而延長熱點資料的有效期
- 使用互斥鎖, 當某個執行緒獲取到快取資料為空時, 對該資料新增讀鎖, 然後去請求資料庫, 從而實現只有一個請求到達資料庫
快取雪崩
快取雪崩: 快取中的大量資料同時失效, 或快取伺服器宕機, 導致大量請求湧進資料庫, 從而導致資料庫宕機。
解決方案
- 儘量避免快取資料同時失效, 在設定資料有效期上增加隨機值, 或使資料有效期均勻分佈
- 後端實現請求限流, 避免大量請求湧入資料庫
- 使用 Redis 的哨兵模式或 Redis 叢集, 保證快取伺服器的高可用性
布隆過濾器
原理: 布隆過濾器是採用 BitMap 來實現的, 大致原理是: 將系統中所有存在的 key 經過 hash 執行後放入 bitmap, 在查詢之前先通過 bitmap 過濾掉一定不存在的 key。
缺點是: 因為有 hash 衝突的問題, 所以通過布隆過濾器的資料也有可能是系統中不存在的 key, 但是沒有通過布隆過濾器的 key 一定是系統中不存在的。