Redis到期,内存泄漏是否符合规范?

时间:2015-04-10 16:32:22

标签: memory-leaks redis ttl

Redis为我们提供了EXPIRETTL个功能。根据{{​​3}},TTL命令可用于区分不存在的密钥和过期的密钥:

> SET foo 3
OK
> GET foo
"3"
> EXPIRE foo 5
(integer) 1
> TTL foo
(integer) 3
> TTL foo
(integer) 2
> TTL foo
(integer) 1
> TTL foo
(integer) 0
> TTL foo
(integer) -2

根据documentation,过期的对象实际上是在访问它们时,或通过定期随机选择过期的密钥从商店中删除的:

  

具体来说,这就是Redis每秒做10次的事情:

     

使用相关过期的密钥集测试20个随机密钥。

     

删除找到的所有已过期的密钥。

     

如果超过25个密钥已过期,请从步骤1重新开始。

-2(或允许生成它的信息代替-1)呢?它是永久保存还是有垃圾收集政策?

另请注意,如果我们为同一个键设置和删除新值,-2将会存活:

> SET foo 3
OK
> ttl foo
(integer) -1
> del foo
(integer) 1
> ttl foo
(integer) -2

因此,例如,假设我们有一个脚本,它们使用增量名称设置密钥,并使它们在1秒后过期。经过很长一段时间后,我们会耗尽记忆吗?

2 个答案:

答案 0 :(得分:4)

  

但是-2(或允许生成它代替-1的信息)怎么样?它是永久保存还是有垃圾收集政策?

-2表示密钥不在数据库中,例如:

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> ttl somekey
(integer) -2

答案 1 :(得分:1)

请参阅Redis as a Least-Recently-Used Cache上的页面 - 您可以告诉Redis不超过设定的内存量,并选择几个关键过期和清除策略之一。

一个微妙的问题是Redis中的所有数据类型并不是很好用,但使用ttl set的设置应该可行。此外,还支持足够的日志记录,以便跟踪调整原因的原因和方式。