文章目錄
- 緩存雪崩
- 緩存擊穿
- 緩存穿透
在實際的業務場景中,Redis 通常作為緩存和其他數據庫(例如 MySQL)搭配使用,用來減輕數據庫的壓力。但是在使用 Redis 作為緩存數據庫的過程中,可能會遇到一些常見問題,例如緩存穿透、緩存擊穿和緩存雪崩等。
緩存雪崩
緩存雪崩是指緩存中大批量的 key 同時過期,于是大量請求訪問數據庫,從而導致數據庫壓力激增,甚至引起數據庫宕機,這種現象被稱為 “緩存雪崩”。
避免緩存雪崩的措施有:
- 給緩存數據設置不同的過期時間,避免同時過期;
- 利用 Redis 集群提高服務可用性,避免因 Redis 宕機引起的緩存雪崩;
- 給緩存業務添加降級限流策略;
- 使用多級緩存架構,分散緩存失效的影響。
緩存擊穿
如果 Redis 中一個被高并發訪問并且緩存重建業務較復雜的 Key 突然失效,那么大量請求將直接訪問數據庫,從而瞬間給數據庫造成巨大沖擊。這種現象被稱為 “緩存擊穿”。
避免緩存擊穿的措施有:
-
使用互斥鎖:
當緩存未命中時,通過互斥鎖方式,確保只有一個線程訪問后端存儲獲取數據,并重建緩存,其他線程保持排隊等待。
優點:沒有額外內存消耗(不需要設置邏輯過期數據);保證數據庫數據與緩存數據的一致性;
缺點:線程需要等待,性能受影響;當多個線程需要競爭多把鎖時,可能會有死鎖風險。
-
邏輯過期:將緩存