緩存穿透
訪問透過緩存直接訪問數據庫。通常是一個不存在的key, 在數據庫查詢時又沒有結果, 然後又沒有做緩存, 導致每次的請求都落在數據庫上,並且高併發, 數據庫扛不住掛掉。
解決方案:
- 數據庫中查詢不到數據時, 仍然做緩存, 只是把有效時間縮短
- 攔截無效的請求,過濾key
- 屏蔽惡意的請求
- 使用布隆過濾器過濾key
緩存雪崩
雪崩,就是某東西蜂擁而至的意思,像雪崩一樣。通常是緩存大規模失效,在高併發情況下大量訪問數據庫。
解決方案:
- 通過在key的失效時間上加一個隨機值,讓key失效的時間更均勻
- 熱點數據, 建議cron定時更新,避免失效
緩存擊穿
非常熱點的key,在不停的扛着大併發。 在其失效的瞬間,持續的大併發就直接請求到數據庫,就好像暴力擊穿一樣。
擊穿與穿透不同。 穿透是想辦法繞過緩存而直接請求db使db掛掉。而擊穿可以理解爲正面大力的擊穿,通常爲大量請求同時操作同一個key, 在該key失效的瞬間大量請求db導致db掛掉.
解決方法:
- 設置熱點數據永遠不過期
- 使用互斥鎖避免大量請求同時落到db (緩存中沒有數據, 給key加鎖,然後獲取數據, 其他的數據請求操作等待,避免同時取數據庫請求再同時大量更新同一個key)
- 做熔斷、降級,防止系統崩潰
- 使用布隆過濾器, 判斷某個容器是否在集合中(what's?)