文章目錄
- 1. 緩存穿透(查不到導致的)
- 1.1 概念
- 1.2 解決方案
- 布隆過濾器
- 緩存空對象
- 2. 緩存擊穿(量太大、緩存過期)
- 2.1 概念
- 2.2 解決方案
- 設置熱點數據永不過期
- 加互斥鎖
- 3. 緩存雪崩(緩存集體失效或 Redis 宕機)
- 3.1 概念
- 3.2 解決方案
- Redis 高可用
- 限流降級
- 數據預熱
1. 緩存穿透(查不到導致的)
1.1 概念
用戶想要查詢一個數據,發現 Redis 數據庫沒有,也就是緩存沒有命中,于是向持久層數據庫查詢,發現也沒有,于是本次查詢失敗。當用戶很多的時候(比如秒殺場景),緩存都沒有命中,于是所有用戶都去請求數據庫。這給持久層數據庫帶來了很大的壓力,這時候就相當于出現了緩存穿透。
1.2 解決方案
布隆過濾器
布隆過濾器是一種數據結構,對所有可能查詢的參數以 Hash 形式存儲,在控制層先進行校驗,不符合要求的就丟棄,從而避免了對底層存儲系統的壓力。
緩存空對象
當存儲層不命中后,即使返回空對象也將其緩存起來,同時會設置一個過期時間。這樣的話,之后再訪問這個數據的時候將會從緩存中取出,保護了后端數據源。
存在的問題:
- 如果空值能夠被緩存起來,這意味著緩存需要更多的空間存儲這些數據,而其中很多數據的值是空的。
2. 緩存擊穿(量太大、緩存過期)
2.1 概念
緩存擊穿,是指一個 key 非常的熱點,在不停的扛著大并發,大并發集中對這一個點進行訪問。當這個 key 在失效的瞬間,持續的大并發就穿破緩存,直接請求數據庫,導致數據庫瞬間壓力過大。
2.2 解決方案
設置熱點數據永不過期
從緩存層面來看,熱點數據不設置過期時間,就不會出現熱點數據過期導致的緩存擊穿。(一直緩存浪費緩存空間)
加互斥鎖
使用分布式鎖,保證對于每個 key 同時只有一個線程去查詢后端服務,其他線程沒有獲得分布式鎖的權限,等待即可。
這種方式將高并發的壓力轉移到了分布式鎖。
3. 緩存雪崩(緩存集體失效或 Redis 宕機)
3.1 概念
緩存雪崩,是指在某一個時間段,緩存集體過期失效或者 Redis 宕機。于是所有的請求都會到達存儲層,存儲層的調用量會暴增,造成存儲層掛掉的情況。
比如雙十一零點搶購商品,搶購的商品肯定集中放在了緩存,假設緩存一個小時。那么到一點的時候,這批商品的緩存都到期了,這時候對這批商品的查詢,都落到了數據庫上。
3.2 解決方案
Redis 高可用
這個思想就是,既然 Redis 有可能掛掉,那我就多增設幾臺 Redis 服務器,其實就是搭建 Redis 集群。
限流降級
這個方案的思想是,在緩存失效后,通過加鎖或者隊列來控制讀數據庫寫緩存的線程數量。
數據預熱
數據預熱的含義就是,在正式部署之前,先把可能訪問的數據預先訪問一遍,這樣部分可能大兩房問的數據就會先加載到緩存中。在即將發生大并發訪問之前,手動觸發加載緩存不同的 key,設置不同的過期時間,讓緩存失效的時間點盡量均勻