redis如何过期密钥?

Ayu*_*pta 39 redis

Redis如何实现密钥的到期?从这里我了解到Redis存储密钥到期的时间,但具体如何实现?

Not*_*fer 86

简而言之 - 对于每个redis对象,都有一个到期时间.除非您将对象设置为过期,否则该时间为"从不".

现在,到期机制本身就是半懒惰的.延迟到期意味着在读取对象之前实际上不会使对象到期.在读取对象时,我们检查它的到期时间戳,如果它在过去,我们什么都不返回,并在我们处于对象时删除该对象.但问题是如果一个键永远不会被触及,它就会毫无理由地占用内存.

因此Redis添加了第二层随机主动到期.它只是一直读取随机密钥,当触摸过期密钥时,它会根据惰性机制被删除.这不会影响到期行为,它只是添加过期密钥的"垃圾收集".

当然实际的实现比这更复杂,但这是主要的想法.

您可以在此处阅读更多相关信息:http://redis.io/commands/expire

有关活动到期周期的源代码可以在这里找到:https://github.com/antirez/redis/blob/unstable/src/server.c#L781

  • @LCB 不明确,不。顺便说一句,Redis 6 将在此机制中进行重大更改,并且此答案很快将仅在参考旧版本的 redis 时才是正确的。 (4认同)
  • 看起来,如果您喜欢整个简洁的事情,您可以收听告诉您 *key* 已过期或已被驱逐的事件,这个计划的美妙之处在于它的简单性。但是,如果您想像对待人一样对待对象并保存从该被驱逐的密钥中获取的所有数据,那么在驱逐时将其序列化到数据库(或您想要的任何地方)怎么办? (2认同)

Ami*_*aei 15

对于 Redis 6,来自发行说明:

Redis 6.0 中的过期周期已被重写,以允许更快的过期,更接近于生存时间 (TTL) 属性。Redis 6 过期将不再基于随机抽样,而是采用基数树中 按过期时间排序的键
Redis 6 发行说明

完整的发行说明在这里


Ami*_*aei 9

参考

Redis 密钥以两种方式过期:被动方式主动方式

当某个客户端尝试访问它时,密钥就会被动地过期,并且发现该密钥已超时。

当然,这还不够,因为存在永远不会再次访问的过期密钥。这些键无论如何都应该过期,因此 Redis 会定期在具有过期设置的键中随机测试一些键。所有已经过期的键都从键空间中删除。

具体来说,Redis 每秒执行 10 次:

从具有关联过期的密钥集中测试 20 个随机密钥。删除所有发现过期的密钥。如果超过 25% 的密钥过期,则从步骤 1 重新开始。 这是一个平凡的概率算法,基本上假设我们的样本代表整个密钥空间,我们继续过期,直到密钥的百分比可能过期低于 25%

这意味着在任何给定时刻,使用内存的已过期键的最大数量最大等于每秒最大写入操作数量除以 4。

  • 更新; Redis 6.0 中对过期周期进行了重写,以允许更快的过期时间,更紧密地匹配生存时间 (TTL) 属性。**Redis 6** 过期将不再基于随机采样,而是采用基数树中按过期时间排序的键 (2认同)