Redis为我们提供了EXPIRE
和TTL
函数。根据文档,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
根据到期规格,在访问过期对象时,或者通过定期随机选择过期密钥,都会从存储中删除过期对象:
具体来说,这就是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秒后过期。在漫不经心的很长一段时间后,我们是否会耗尽记忆?
发布于 2015-04-10 08:41:34
请参阅作为最近使用最少的缓存上的页面--您可以告诉Redis不要超过设定的内存数量,并选择几个键过期和清除策略中的一个。
一个微妙的问题是,并不是所有Redis中的数据类型都能很好地处理这个问题,但是带有ttl集的集合应该可以工作。还支持为您提供足够的日志记录,以跟踪在您优化这个日志时发生了什么、原因以及如何进行。
发布于 2015-04-10 11:30:38
但是-2 (或者允许生成它的信息,而不是-1)呢?是永远保留还是有垃圾收集政策?
-2
表示密钥不在数据库中,例如:
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> ttl somekey
(integer) -2
https://stackoverflow.com/questions/29566414
复制