Appearance
过期删除策略
三种策略
1. 定时删除
设置TTL时创建定时器,过期立即删除。
优点:及时释放内存
缺点:占用CPU,影响响应2. 惰性删除
访问key时检查是否过期,过期则删除。
优点:CPU友好
缺点:内存不释放,可能OOM3. 定期删除
每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
