快取穿透、快取擊穿、快取雪崩的場景以及解決方法

柒墨轩發表於2024-07-17

都是快取惹的禍
在專案開發中,我們的資料都是要持久化到磁碟中去,比如使用 MySQL進行持久化儲存,但是呢由於流量越來越大,查詢速度也逐漸變慢了起來,於是我們決定!使用快取!然而使用快取導致會經常面臨三座大山!快取穿透!!快取擊穿!!快取雪崩!!,接下來我們將會逐一分析他們導致的原因以及解決方法。
快取雪崩

介紹
快取雪崩是指在某個時間點,大量快取同時失效或被清空,導致大量請求直接打到資料庫或後端系統,造成系統負載激增,甚至引發系統崩潰。這通常是由於快取中的大量資料在同一時間失效引起的。想象一個線上電商系統,使用者訪問頻繁,需要頻繁查詢商品資訊。假設某一系列的商品突然全部同一時間失效,那就會造成我們的快取雪崩。或者某一個時刻 Redis 快取中介軟體故障了,導致服務全部打到了資料庫,也會導致快取雪崩的情況。
解決辦法
快取鍵同時失效:
1)過期時間隨機化:設定快取的過期時間,加上一個隨機值,避免同一時間大量快取失效。
2)使用多級快取:引入多級快取機制,如本地快取和分散式快取相結合,減少單點故障風險。
3)快取預熱:系統啟動時提前載入快取資料,避免大量請求落到冷啟動狀態下的資料庫。
4)加互斥鎖:保證同一時間只有一個請求來構建快取,別的只能等它構建完成再從快取中讀取。
快取中介軟體故障:
1)服務熔斷:暫停業務的返回資料,直接返回錯誤。
2)構建叢集:構建多個 Redis 叢集保證其高可用。
快取擊穿

介紹
快取擊穿是指標對某一熱點資料的大量請求導致快取失效,進而直接請求資料庫,增加資料庫負載。這種情況通常發生在某個特定的快取 key 在失效時,恰好有大量請求到達。想象一下大家都在搶茅臺,但在某一時刻茅臺的快取失效了,大家的請求打到了資料庫中,這就是快取擊穿,那他跟快取雪崩有什麼區別呢?快取雪崩是多個 key 同時,快取擊穿是某個熱點 key 崩潰。也可以認為快取擊穿是快取雪崩的子集,
解決辦法
1)加互斥鎖:保證同一時間只有一個請求來構建快取,別的只能等它構建完成再從快取中讀取。跟快取雪崩相同。
2)永久:不要給熱點資料設定過期時間。
快取穿透

介紹
快取穿透是指查詢一個不存在的資料,由於快取和資料庫中均不存在,導致每次請求都直接訪問資料庫增加資料庫負載。攻擊者可以透過構造不存在的 key 發起大量請求,造成系統當機。比如有些小黑子對於我們開發的網站進行惡意的請求,將一些資料庫不存在的 ID 瘋狂的打在我們的伺服器上,如果沒做好快取穿透的預防,還真給你們小黑子得逞了。
解決辦法
1)防止非法請求:檢查非法請求,封禁其IP 以及賬號,防止它再次為非作歹。。
2)快取空值:允許快取空值或者可以給他一個預設值。
3)使用布隆過濾器:透過布隆過濾器給資料做一個標記,當發生快取穿透時也不會請求資料庫造成壓力直接透過布降過濾器和 Redis 判斷返回。

相關文章