2016-03-23 149 views
9

Redis如何实现密钥的到期?从here我了解到Redis存储密钥将到期的时间,但实现的具体时间是什么?redis如何过期密钥?

+0

标题和问题不匹配。你在问什么? redis如何过期密钥?或是否有可能过期列表中的项目? –

+0

@Not_a_Golfer我已经改变了标题,对于混淆抱歉。 –

回答

24

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

现在,到期机制本身是半懒惰的。延迟过期意味着在读取对象之前不会实际过期。在这种情况下,读取一个对象,我们检查它的到期时间戳,如果它在过去,我们不返回任何内容,并在我们处理时删除对象。但问题是,如果一个钥匙从未被触摸过,它就会无缘无故地占用记忆。

因此,Redis增加了第二层随机有效到期。它只是随时读取随机密钥,并且当过期密钥被触摸时,它会根据延迟机制被删除。这不会影响到期行为,它只是添加了过期密钥的“垃圾回收”。

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

你可以阅读更多关于它在这里:http://redis.io/commands/expire

而对于主动过期周期的源代码可以在这里找到:https://github.com/antirez/redis/blob/unstable/src/server.c#L781