緩存穿透/雪崩/擊穿

緩存穿透

訪問透過緩存直接訪問數據庫。通常是一個不存在的key, 在數據庫查詢時又沒有結果, 然後又沒有做緩存, 導致每次的請求都落在數據庫上,並且高併發, 數據庫扛不住掛掉。

解決方案:

  • 數據庫中查詢不到數據時, 仍然做緩存, 只是把有效時間縮短
  • 攔截無效的請求,過濾key
  • 屏蔽惡意的請求
  • 使用布隆過濾器過濾key

緩存雪崩

雪崩,就是某東西蜂擁而至的意思,像雪崩一樣。通常是緩存大規模失效,在高併發情況下大量訪問數據庫。

解決方案:

  • 通過在key的失效時間上加一個隨機值,讓key失效的時間更均勻
  • 熱點數據, 建議cron定時更新,避免失效

緩存擊穿

非常熱點的key,在不停的扛着大併發。 在其失效的瞬間,持續的大併發就直接請求到數據庫,就好像暴力擊穿一樣。

擊穿與穿透不同。 穿透是想辦法繞過緩存而直接請求db使db掛掉。而擊穿可以理解爲正面大力的擊穿,通常爲大量請求同時操作同一個key, 在該key失效的瞬間大量請求db導致db掛掉.

解決方法:

  • 設置熱點數據永遠不過期
  • 使用互斥鎖避免大量請求同時落到db (緩存中沒有數據, 給key加鎖,然後獲取數據, 其他的數據請求操作等待,避免同時取數據庫請求再同時大量更新同一個key)
  • 做熔斷、降級,防止系統崩潰
  • 使用布隆過濾器, 判斷某個容器是否在集合中(what's?)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章