緩存收益與成本
- 收益
- 加速讀寫
- 降低后端、持久層的負載和壓力
- 成本
- 可能導致數據不一致
- 代碼運維成本
- redis節點運維成本
緩存更新策略
策略 | 一致性 | 維護成本 | 介紹 |
---|---|---|---|
LRU/LIRS算法剔除 | 最差 | 底 | 剔除最近最少使用的數據 |
超時剔除 | 較差 | 底 | 定時刪除、惰性刪除 |
主動更新 | 最好 | 高 | 持久層更新,緩存層也更新 |
緩存粒度
-
緩存粒度概念
- 緩存中數據存儲的規模
- 全部存儲、部分存儲
-
全部存儲、部分存儲對比
存儲方式 通用性 占用空間 代碼維護 部分存儲 弱 少 難 全部存儲 強 多 易
緩存雪崩
- 緩存雪崩概念
- 由于緩存層宕機了,導致前端流量全部涌向持久層
- 從而造成連鎖反應,持久層也宕機了
- 緩存雪崩解決方法
- 使用redis-sentinel和redis-cluster增強redis的高可用性
- 提前演練
緩存無底洞
- 緩存無底洞概念
- 當緩存集群中機器過多,且數據部分太分散時
- 如果客戶端的一個命令,需要從多個節點中獲取數據才能完成
- 那么可能由于網絡傳輸的問題,導致機器越多,執行越慢
- 緩存無底洞解決
- 減少網絡請求的次數
- 降低網絡請求帶來的消耗,比如加入連接池等等
緩存穿透
-
緩存穿透概念
-
大量的請求不命中,既不命中redis也不命中持久層
-
示意圖
-
-
緩存穿透產生原因
- 業務代碼有問題,使用戶請求一些不存在或不能訪問的數據
- 惡意攻擊,爬蟲
-
緩存穿透發現
- 響應請求的時間
- 查看日志記錄
-
緩存穿透解決方法
-
方法1:緩存空對象
-
原理:當請求一個不存在的數據時,在redis層存儲一個空對象
-
缺點:占用更多的空間;可能導致數據不一致
-
-
方法2:布隆過濾器
- 原理:使用布隆過濾器
- 缺點:很難設計和使用
-
熱點key重建
-
熱點key重建概念
- 當一個數據突然成為熱點時(比如微博的熱點),且整個數據之前并沒有在緩存時
- 由于服務器是高并發的,所以可能會有多個線程都進行將熱點數據寫入緩存的操作
- 這樣很多的重復操作會帶來非常大的性能消耗
-
熱點key解決方法
- 使用互斥鎖
- 原理:一個線程在準備重建時進行加鎖,則其他線程不能再重建
- 缺點:可能導致大量的線程在等待
- 永遠不過期策略
- 【不懂】
- 使用互斥鎖
-
兩種方法對比
方案 優點 缺點 互斥鎖 思路簡單;保持一致性 存在死鎖風險;可能很多線程等待 永遠不過期策略 杜絕很多線程等待問題 不保證一致性