快取穿透,快取雪崩,快取擊穿
本文整理自黑馬程式員相關資料
快取穿透
快取穿透是指客戶端請求的資料在快取中和資料庫中都部存在,這樣快取永遠不會生效,因此這些請求都會穿過快取,最終請求到資料庫上,對資料庫造成非常大的壓力,
常見的解決方案有兩種:
-
快取空物件:當快取和資料庫都沒有請求的資料時,將查詢的key的value設定為NULL值快取到Redis中,下次再查詢時會在Redis中查到NULL值,請求不會到達資料庫,

- 優點:實作簡單,維護方便
- 缺點:
- 因為快取了空物件,任意key的查詢都快取了NULL值,相當于快取了很多的無用資料,所以造成了額外了記憶體消耗,可以通過設定TTL過期時間來減少記憶體的消耗
- 可能會存在短期的不一致,取決于NULL值的過期時間,例如對一個key設定了NULL值,但是資料庫剛好更新了該key對應的值,而Redis中該key對應的值為NULL,只有在這個key過期之后,才會更新為資料庫中的值,
-
布隆過濾:在客戶端與Redis中間加入布隆過濾器,如果布隆過濾器判斷查詢的資料不存在則直接拒絕,布隆過濾器如果判斷不存在則一定不存在,判斷存在則可能不存在,

- 優點:記憶體占用少,沒有多余的key
- 缺點:
- 實作復雜
- 存在誤判可能,因為布隆過濾器如果判斷不存在則一定不存在,判斷存在則可能不存在,
? 快取穿透的其他解決方案:
- 增強key的復雜性,避免被猜測key的規律
- 做好資料的基礎格式校驗,如果不符合預先設定的格式,直接拒絕,
- 加強用戶權限校驗,避免接收不相干用戶發出的惡意請求
- 做好熱點引數的限流
快取雪崩
快取雪崩是指在同一時段大量快取key同時失效或者Redis服務宕機,導致大量請求到達資料庫,給資料庫帶來巨大壓力,
解決方案:
- 給不同的key的TTL添加隨機值,避免大量的key同時到期
- 利用Redis集群提高服務的可用性,避免Redis服務宕機后的資料丟失和請求直達資料庫
- 給快取業務添加降級限流策略
- 給業務添加多級快取
快取擊穿
快取擊穿問題也叫熱點key問題,就是一個高并發訪問并且快取重建業務比較復雜的key突然失效了,無數的請求訪問會在瞬間給資料庫帶來巨大的沖擊,
解決方案:
互斥鎖:即只允許一個執行緒進行快取重建,其他執行緒在快取重建成功之前只能不斷的重試,

邏輯過期:在熱點key的value中設定邏輯過期時間,查詢快取的時候判斷邏輯過期時間是否已經過期,如果已經過期,則獲取互斥鎖另開執行緒進行快取重建,其他執行緒發現過期但獲取互斥鎖失敗,回傳過期資料,

兩種解決方案的優缺點:
| 解決方案 | 優點 | 缺點 |
|---|---|---|
| 互斥鎖 | 因為沒有設定邏輯過期時間,所以沒有額外的記憶體消耗,保持一致性,實作簡單 | 執行緒需要等待,性能受影響,可能有死鎖風險 |
| 邏輯過期 | 執行緒無需等待,性能較好 | 不保證一致性,有額外的記憶體消耗,實作復雜 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/499127.html
標籤:NoSQL
上一篇:Redis快取更新策略
下一篇:分布式鎖
