Skip to content

过期删除策略

三种策略

1. 定时删除

设置TTL时创建定时器,过期立即删除。

优点:及时释放内存
缺点:占用CPU,影响响应

2. 惰性删除

访问key时检查是否过期,过期则删除。

优点:CPU友好
缺点:内存不释放,可能OOM

3. 定期删除

每100ms随机检查部分key,删除过期的。

c
// redis.c
for (int j = 0; j < dbs_per_call; j++) {
    // 随机选择数据库
    // 随机检查部分key
    // 删除过期的
}
优点:平衡内存和CPU
缺点:可能延迟删除

Redis实现

Redis采用惰性删除 + 定期删除组合。

惰性删除

c
// expireIfNeeded
if (checkExpire(key)) {
    deleteKey(key);
}

定期删除

c
// activeExpireCycle
// 每100ms执行
// 每次检查部分数据库

面试考点

Q: 为什么用组合策略?

  • 惰性:省CPU,但可能堆积过期key
  • 定期:主动清理,但影响响应
  • 组合:平衡两者

Q: 内存淘汰 vs 过期删除?

  • 过期删除:主动清理TTL已过期的key
  • 内存淘汰:内存不足时清理任意key

最后更新: