## 更新策略
* 緩存中的數據通常都是有生命周期的,需要在指定時間后被刪除或更新,這樣可以保證緩存空間在一個可控的范圍
* 但是緩存中的數據會和數據源中的真實數據有一段時間窗口的不一致,需要**利用某些策略進行更新**
* 下面將分別從使用場景、一致性、開發人員開發/維護成本三個方面介紹三種緩存的更新策略
### ①LRU/LFU/FIFO算法剔除
* **使用場景**:剔除算法通常用于緩存使用量超過了預設的最大值時候,如何對現有的數據進行剔除。例如Redis使用maxmemory-policy這個配置作為內存最大值后對于數據的剔除策略
* **一致性**:要清理哪些數據是由具體算法決定,開發人員只能決定使用哪種算法,所以數據的一致性是最差的
* **維護成本**:算法不需要開發人員自己來實現,通常只需要配置最大maxmemory和對應的策略即可。開發人員只需要知道每種算法的含義,選擇適合自己的算法即可
* 關于maxmemory-policy和maxmemory可以參閱:[https://blog.csdn.net/qq\_41453285/article/details/106199033](https://blog.csdn.net/qq_41453285/article/details/106199033)
### ②超時剔除
* **使用場景:**超時剔除通過給緩存數據設置過期時間,讓**其在過期時間后自動刪除**,例如Redis提供的expire命令。如果業務可以容忍一段時間內,緩存層數據和存儲層數據不一致,**那么可以為其設置過期時間**。在數據過期后,再從真實數據源獲取數據,重新放到緩存并設置過期時間。例如一個視頻的描述信息,可以容忍幾分鐘內數據不一致,但是涉及交易方面的業務, 后果可想而知
* **一致性**:一段時間窗口內(取決于過期時間長短)存在一致性問題,即緩存數據和真實數據源的數據不一致
* **維護成本**:維護成本不是很高,只需設置expire過期時間即可,當然前 提是應用方允許這段時間可能發生的數據不一致
### ③主動更新
* **使用場景**:應用方對于數據的一致性要求高,**需要在真實數據更新后, 立即更新緩存數據**。例如可以利用消息系統或者其他方式通知緩存更新
* **一致性**:一致性最高,但如果主動更新發生了問題,那么這條數據很可能很長時間不會更新,所以建議結合超時剔除一起使用效果會更好
* **維護成本**:維護成本會比較高,開發者需要自己來完成更新,并保證更新操作的正確性
### **下圖給出了緩存的三種常見更新策略的對比:**

**有兩個建議:**
* **低一致性業務**:建議配置最大內存和淘汰策略的方式使用
* **高一致性業務**:可以結合使用超時剔除和主動更新,這樣即使主動更新出了問題,也能保證數據過期時間后刪除臟數據
- Redis簡介
- 簡介
- 典型應用場景
- Redis安裝
- 安裝
- redis可執行文件說明
- 三種啟動方法
- Redis常用配置
- API的使用和理解
- 通用命令
- 數據結構和內部編碼
- 單線程
- 數據類型
- 字符串
- 哈希
- 列表
- 集合
- 有序集合
- Redis常用功能
- 慢查詢
- Pipline
- 發布訂閱
- Bitmap
- Hyperloglog
- GEO
- 持久化機制
- 概述
- snapshotting快照方式持久化
- append only file追加方式持久化AOF
- RDB和AOF的抉擇
- 開發運維常見問題
- fork操作
- 子進程外開銷
- AOF追加阻塞
- 單機多實例部署
- Redis復制原理和優化
- 什么是主從復制
- 主從復制配置
- 全量復制和部分復制
- 故障處理
- 開發運維常見問題
- Sentinel
- 主從復制高可用
- 架構說明
- 安裝配置
- 客戶端連接
- 實現原理
- 常見開發運維問題
- 高可用讀寫分離
- 故障轉移client怎么知道新的master地址
- 總結
- Sluster
- 呼喚集群
- 數據分布
- 搭建集群
- 集群通信
- 集群擴容
- 集群縮容
- 客戶端路由
- 故障轉移
- 故障發現
- 故障恢復
- 開發運維常見問題
- 緩存設計與優化
- 緩存收益和成本
- 緩存更新策略
- 緩存粒度控制
- 緩存穿透優化
- 緩存雪崩優化
- 無底洞問題優化
- 熱點key重建優化
- 總結
- 布隆過濾器
- 引出布隆過濾器
- 布隆過濾器基本原理
- 布隆過濾器誤差率
- 本地布隆過濾器
- Redis布隆過濾器
- 分布式布隆過濾器
- 開發規范
- 內存管理
- 開發運維常見坑
- 實戰
- 對文章進行投票
- 數據庫的概念
- 啟動多實例