【发布时间】:2015-06-16 11:11:59
【问题描述】:
Redis 为我们提供了EXPIRE 和TTL 函数。根据documentation,TTL命令可以用来区分不存在和过期的key:
> 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
根据EXPIRE specification,过期对象实际上是在访问时从存储中删除的,或者通过定期随机选择过期键:
具体来说,这是 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 秒后过期。过了任意长的时间,我们会不会耗尽内存?
【问题讨论】:
标签: memory-leaks redis ttl