Redis 如何删除过期数据?
Redis 使用惰性删除和定期删除两种机制来处理过期数据的删除,确保内存和性能的平衡。
Redis 删除过期数据主要依赖两种策略的结合:惰性删除 和 定期删除:
- 惰性删除(Lazy Expiration):
- 运行机制:当客户端访问某个 Key 时,Redis 会先检查该 Key 是否过期。如果已过期,立即删除该 Key 并返回空值,否则正常访问。
- 优缺点:
- 优点:仅在访问时触发操作,节省 CPU 资源。
- 缺点:未被访问的过期 Key 会长期占用内存。
- 定期删除(Regular Expiration):
- 运行机制:Redis 默认每秒执行 10 次扫描(由配置参数
hz
控制),每次随机抽取一定数量的 Key(默认 20 个设置了过期时间的 Key)。若发现过期键则删除,且如果过期键比例超 25%,则重复扫描(但单次最长扫描时间不超过 25ms)。 - 补充配置:
- 通过
active-expire-effort
参数可调整扫描强度(范围 1-10,默认 1),强度越大消耗 CPU 越多。# 配置示例 hz 10 # 默认每秒 10 次定期扫描 active-expire-effort 3 # 调整扫描强度
- 通过
- 优缺点:
- 优点:兼顾内存释放效率和 CPU 负载。
- 缺点:并非实时删除所有过期键。
- 运行机制:Redis 默认每秒执行 10 次扫描(由配置参数
两种策略结合的意义:惰性删除减少实时 CPU 压力,定期删除清理长期未访问的数据,确保内存和性能平衡。当两种策略仍无法解决内存不足时,Redis 会启动淘汰策略(如 allkeys-lru
),以释放空间存储新数据。