Redis 过期策略
什么是过期策略
Redis 的过期策略用于管理设置了过期时间(TTL)的键,确保在键过期后能够被及时删除,从而释放内存
整体策略
Redis 采用的是定期删除
+惰性删除
的组合策略
1. 定期删除
- 原理:周期性的从过期键集合中抽取一部分键,验证其过期时间,若已过期则删除。
- 频率:
默认
每秒运行 10 次,即每100ms
一次,可以通过修改配置更改频率 - 优点:主动清理过期键,避免内存浪费,同时这种方式能保证抽取检查的过程足够快,避免长时间阻塞
- 缺点:占用一定的 CPU 资源
为什么定期删除是周期性的抽取部分键?
因为redis是单线程的程序,主要的任务是处理每个命令的任务。
如果扫描过期key消耗的时间太多,就可能导致正常处理请求命令被阻塞(类似于在大量数据的背景下执行key *的效果)
2. 惰性删除
- 原理:当键到达过期时间时,并不会立即被删除。而是当后续有请求访问该键时,Redis 服务器才会触发删除操作,并返回
nil
。 - 优点:节省 CPU 资源,只在必要时检查。
- 缺点:如果一个键已经过期并一直未被访问,它会持续占用内存,造成内存资源浪费
其他补充策略
为了弥补定期删除和惰性删除的不足,Redis 还提供了一系列 内存淘汰策略,用于在内存不足时主动淘汰部分键,保障服务器的正常运行。
Redis 内置淘汰策略
策略 | 淘汰范围 | 淘汰算法 |
---|---|---|
noeviction | 无(默认策略) | 内存不足时写入操作报错 |
allkeys-lru | 所有键 | LRU |
allkeys-random | 所有键 | 随机淘汰 |
volatile-lru | 设置过期时间的键 | LRU(最近最少使用) |
volatile-random | 设置过期时间的键 | 随机淘汰 |
volatile-ttl | 设置过期时间的键 | 优先淘汰较早过期的键(FIFO) |