Redis 源码解析 - Redis 过期策略

Redis的过期策略主要涉及两个方面:惰性过期(Lazy Expiration)和定期删除(Periodic Expiration),以及从Redis 4.0开始引入的惰性释放(Lazy Free)机制。下面是对这些策略的简要解析,结合源码位置来深入理解:

1. 惰性过期(Lazy Expiration)

当客户端尝试访问一个键时,Redis会检查该键是否已经过期。如果过期,则在执行操作之前删除该键。这种策略减少了定期检查键是否过期所需的CPU时间,但可能导致已过期键占用内存稍长一些时间。

  • 源码位置:检查过期发生在键访问的各种操作中,如db.c中的lookupKeyReadlookupKeyWrite函数,它们会调用expireIfNeeded来检查并删除过期键。

2. 定期删除(Periodic Expiration)

Redis使用一个后台进程(称为过期键清除器,expiration ticker)周期性地检查并删除过期的键。这个进程不是持续运行,而是在每次执行某些操作(如redisCommand函数调用)时,有一定概率触发,以分摊清理操作的开销。它的主要目的是避免内存中累积太多过期键。

  • 源码位置:定期删除的触发逻辑在server.cactiveExpireCycle函数中实现。该函数会根据配置的策略(如每秒检查多少个键)来决定清理多少过期键。

3. 惰性释放(Lazy Free)

从Redis 4.0起,引入了惰性释放机制,用于释放大对象时减少主线程的阻塞。当一个键由于过期或显式删除命令而需要释放时,惰性释放不会立即回收其内存,而是标记为已删除,并在后续操作中逐步回收。这适用于大值对象,小对象仍可能立即释放。

  • 源码位置:惰性释放的策略体现在lazyfree.c文件中,通过配置项lazyfree-lazy-expire控制是否开启针对过期键的惰性释放。

实现细节

  • 过期键存储:每个键在数据库中存储时,会有一个额外的过期时间字段,用于记录该键何时过期。

  • 过期时间设置:通过expirepexpire等命令设置键的过期时间,这些操作修改键的元数据信息。

  • 随机过期时间偏移:为了防止大量键同时过期导致的内存回收压力,可以考虑在设置过期时间时加入一个小范围的随机偏移量,但这通常作为应用层的策略而非Redis内建功能。

综上所述,Redis的过期策略通过惰性过期和定期删除相结合的方式,实现了高效且灵活的过期键管理,同时惰性释放机制进一步提升了高负载情况下服务的稳定性。这些策略在Redis源码中有详细的实现,可以通过阅读相关文件深入理解。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值