- redis 使用惰性删除和定期删除
常见的删除策略
惰性删除
- 当 key 过期时,不管他
- 当客户端尝试访问 key 时,会判断该 key 是否过期,过期就删除该键
- 特点
- CPU友好,浪费内存空间
- 如果 key 过期时,如果不被访问,会一致存在内存中
定时删除
- 在设置过期时间时,创建一个定时器,在键的过期时间到来时,立即对键进行删除
- 会有大量的定时器,性能浪费
定期删除
- 在单位时间内,程序对内存中的数据进行检查,删除里面的过期 key
- 单位时间太小,会占用 cpu,太大会浪费内存,由算法决定
- 例子: 假设 Redis 每秒进行处理
- 测试随机的一些 key 进行过期检查,比如 1000 个key
- 删除上述 key 中过期的那部分
- 如果步骤 a 中的 key 有多余 25% 的过期,会重复步骤 a
删除策略
惰性删除策略
- 操作 key 时,使用
expireIfNeeded
函数判断 key 是否过期
定期删除策略
- serverCron 函数(redis 的定时函数) 执行时,调用
activeExpireCycle
函数- 在规定的时间里面分多次遍历服务器的 expires 字典随机检查一部分 key 的过期时间,并删除其中的过期 key