一. 緩存雪崩
“雪崩來臨的時候沒有一片雪花是無辜的”。緩存雪崩就是大范圍甚至于整個redis提供的緩存服務不可用了,進而導致所有的請求都直接到了數據庫,甚至于擊垮整個服務鏈路。造成整個服務不可用。
出現原因:
給緩存設置了過期時間,且大范圍的緩存數據的過期時間一致。
redis服務宕機。
解決方案:
提前預案: 給redis過期時間加隨機值預防大面積的緩存同時過期失效。redis集群高可用可用,哨兵機制。
兜底方案: 服務熔斷,服務降級。監控到緩存服務不可用時直接返回,或者限制流量直接請求到數據庫層。
二. 緩存擊穿
相交于緩存雪崩大范圍或整體緩存不可用緩存擊穿則是指某個熱點key過期,導致的緩存失效。常常是一部分熱點數據,如秒殺產品的庫存數據。
出現原因:熱點數據過期,或者被其他手段刪除。
解決方案:
對于熱點數據緩存時不設置過期時間。
第一個請求發現熱點數據不在redis緩存中,可以先阻塞其他請求,等到第一個請求將數據庫數據讀出來并緩存到redis后再喚醒其他請求從緩存服務中讀取熱點數據。
三. 緩存穿透
緩存穿透則是另外一個層面,指的時請求所訪問的數據既不在緩存中,也不在數據庫中。如果應用持續有大量請求訪問數據,就會同時給緩存和數據庫帶來巨大壓力。
出現原因:
業務層誤操作訪問到了不會存在的數據。
惡意請求攻擊
解決方案:
第一個請求發現熱點數據不在redis緩存中和數據庫中,可以先阻塞其他請求,緩存一個缺省值返回。
利用redis提供的布隆過濾器。
前端有效值校驗。
四. 總結
緩存雪崩 ,緩存擊穿 均屬于緩存失效的一種異常緩存雪崩影響范圍大于緩存擊穿。緩存穿透 則是數據本身就不在在整個數據存儲層。