## 更新策略
* 缓存中的数据通常都是有生命周期的,需要在指定时间后被删除或更新,这样可以保证缓存空间在一个可控的范围
* 但是缓存中的数据会和数据源中的真实数据有一段时间窗口的不一致,需要**利用某些策略进行更新**
* 下面将分别从使用场景、一致性、开发人员开发/维护成本三个方面介绍三种缓存的更新策略
### ①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过期时间即可,当然前 提是应用方允许这段时间可能发生的数据不一致
### ③主动更新
* **使用场景**:应用方对于数据的一致性要求高,**需要在真实数据更新后, 立即更新缓存数据**。例如可以利用消息系统或者其他方式通知缓存更新
* **一致性**:一致性最高,但如果主动更新发生了问题,那么这条数据很可能很长时间不会更新,所以建议结合超时剔除一起使用效果会更好
* **维护成本**:维护成本会比较高,开发者需要自己来完成更新,并保证更新操作的正确性
### **下图给出了缓存的三种常见更新策略的对比:**
![](https://img.kancloud.cn/b7/04/b704927a91ea2a2b5b3ebadfeae208a2_793x178.png)
**有两个建议:**
* **低一致性业务**:建议配置最大内存和淘汰策略的方式使用
* **高一致性业务**:可以结合使用超时剔除和主动更新,这样即使主动更新出了问题,也能保证数据过期时间后删除脏数据
- 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布隆过滤器
- 分布式布隆过滤器
- 开发规范
- 内存管理
- 开发运维常见坑
- 实战
- 对文章进行投票
- 数据库的概念
- 启动多实例