Redis为我们提供了EXPIRE
和TTL
个功能。根据{{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秒后过期。经过很长一段时间后,我们会耗尽记忆吗?
答案 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的设置应该可行。此外,还支持足够的日志记录,以便跟踪调整原因的原因和方式。