Redis的过期键的删除策略
Redis 的过期键删除策略采用 被动删除(惰性删除) 和 主动删除(定期删除) 结合的方式,并在内存不足时触发 内存淘汰机制。以下是具体策略的详细说明:
1、惰性删除
策略 | 触发条件 | 执行逻辑 | 优点 | 缺点 |
---|---|---|---|---|
惰性删除 | 客户端访问键时 | 检查键是否过期: – 过期则删除并返回 nil – 未过期则正常处理请求 |
不主动消耗 CPU 资源 | 可能导致过期键长期占用内存 |
适用场景 | 读多写少、过期键易被访问 | — | — | — |
2、定期删除
策略 | 触发条件 | 执行逻辑 | 优点 | 缺点 |
---|---|---|---|---|
定期删除 | 周期性任务(默认每 100ms) | 1. 从每个数据库随机抽样少量键(默认 20 个) 2. 删除其中过期的键 3. 若过期键比例 > 25%,重复抽样(最多循环 ACTIVE_EXPIRE_CYCLE_LOOP 次,单次耗时 ≤ 25ms) |
主动清理过期键,避免内存泄漏 | 无法保证即时删除所有过期键 |
配置参数 | hz (默认 10,即每秒 10 次) |
— | 增大 hz 提升清理频率 |
增大 hz 会增加 CPU 消耗 |
3、内存淘汰机制
当内存使用达到 maxmemory
限制时,强制删除键(包括未过期键),优先淘汰过期键或符合策略的键:
策略 | 作用范围 | 淘汰逻辑 |
---|---|---|
volatile-ttl |
仅设置过期时间的键 | 优先删除剩余存活时间(TTL)最短的键 |
volatile-random |
仅设置过期时间的键 | 随机删除设置过期时间的键 |
volatile-lru |
仅设置过期时间的键 | 淘汰最近最少使用(LRU)的键 |
volatile-lfu |
仅设置过期时间的键 | 淘汰最不常用(LFU)的键 |
allkeys-random |
所有键(无论是否过期) | 随机删除任意键 |
allkeys-lru |
所有键(无论是否过期) | 淘汰最近最少使用(LRU)的键 |
allkeys-lfu |
所有键(无论是否过期) | 淘汰最不常用(LFU)的键 |
noeviction (默认) |
所有键 | 禁止删除任何键,写入操作报错 |