菜鸟笔记
提升您的技术认知

Redis的过期键的删除策略

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(默认) 所有键 禁止删除任何键,写入操作报错