Redis过期键的删除策略有哪些?
更多面试题请看这里:https://interview.raoyunsoft.com/
面试题专栏会持续更新欢迎关注订阅
Redis 通过三种策略管理过期键的清理,确保内存高效利用并平衡性能:
1. 定时删除(主动删除)
- 机制:为每个键设置过期时间时,同时创建一个定时器(Timer)。当键过期时立即触发删除操作。
- 优点:内存释放及时,避免内存浪费。
- 缺点:
- 大量定时器消耗CPU资源,影响吞吐量。
- 频繁创建/销毁定时器增加系统开销。
- 适用场景:对内存敏感但CPU资源充足的场景。
2. 惰性删除(被动删除)
- 机制:不主动清理过期键,仅在访问键时检查过期状态。若已过期则删除并返回空值;未过期则正常返回数据。
- 优点:
- CPU开销极低,只在访问时触发检查。
- 实现简单,无额外后台任务。
- 缺点:
- 内存释放不及时,长期未访问的过期键会占用内存(内存泄漏风险)。
- 典型场景:
GET
、HGET
等读操作触发检查。
# 伪代码示例:惰性删除流程
def get_key(key):if key in redis_db:if is_expired(key): # 检查过期时间delete_key(key) # 删除过期键return Noneelse:return redis_db[key]return None
3. 定期删除(折中策略)
- 机制:周期性扫描数据库(默认每秒10次),每次随机抽取部分键检查过期状态并批量删除。
- 流程控制:
- 限制每次扫描的时长和数量,避免阻塞主线程。
- 通过算法动态调整扫描频率(如根据过期键比例)。
- 优点:
- 平衡内存和CPU:减少惰性删除的内存泄漏,避免定时删除的CPU峰值。
- 缺点:
- 时效性不如定时删除,可能短暂残留过期键。
graph TDA[启动定期删除任务] --> B[随机选择20个键]B --> C{检查是否过期?}C -->|是| D[删除键]C -->|否| E[跳过]D --> F{本轮删除键数量≥25%?}E --> FF -->|是| B[继续本轮扫描]F -->|否| G[结束本轮任务]
Redis 的实际策略组合
Redis 默认采用「惰性删除 + 定期删除」组合:
- 读写时触发惰性删除,保证基础性能。
- 定期删除补充清理(通过
hz
参数调整频率),防止内存堆积。 - 定时删除仅用于特殊场景(如
SET key value EX
的原子操作)。
⚠️ 注意:若大量键集中过期(如缓存雪崩),定期删除可能无法及时清理,需结合
maxmemory-policy
(如LRU)避免OOM。