Memory leaks Redis过期,内存泄漏(按规格)?
为我们提供Memory leaks Redis过期,内存泄漏(按规格)?,memory-leaks,redis,ttl,Memory Leaks,Redis,Ttl,为我们提供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 根
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秒后过期。经过任意长时间后,我们是否会耗尽内存?请参阅上的页面--您可以告诉Redis不要超过设定的内存量,并从几个密钥过期和清除策略中选择一个
一个微妙的问题是,并非Redis中的所有数据类型都能很好地显示,但使用ttl set的集合应该可以工作。它还支持足够的日志记录,以便您在调优时跟踪发生的情况、原因和方式。请参阅上的页面--您可以告诉Redis不要超过设置的内存量,并从几个密钥过期和清除策略中选择一个
一个微妙的问题是,并非Redis中的所有数据类型都能很好地显示,但使用ttl set的集合应该可以工作。还支持足够的日志记录,以便在调优时跟踪发生的情况、原因和方式
但是-2(或者允许生成它来代替-1的信息)呢?它是永久保存还是有垃圾收集政策
-2
表示密钥不在数据库中,例如:
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> ttl somekey
(integer) -2
但是-2(或者允许生成它来代替-1的信息)呢?它是永久保存还是有垃圾收集政策
-2
表示密钥不在数据库中,例如:
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> ttl somekey
(integer) -2
对这就是重点。问题是我们如何摆脱
-2
,因为如果我们将-2
累积为无限个键,我们将耗尽我们的内存。当然,速度很慢。不需要额外的记忆——这相当于存在。好吧,我们已经有了答案,但是。。。它怎么能不需要额外的内存呢?在某个地方必须有一个数据结构,可以调用与计时器关联的键,否则系统如何记住将-2
放在何处?就实现而言,在redis中,我希望在某个地方存在类似Structure的字典,过期的密钥正在使用它的一个插槽。-2表示该密钥不存在-它可能已过期,也可能从未创建过(请参见我答案中的示例)。我知道如果我坚持,它会发生;)现在出去做真正的伤害吧!对这就是重点。问题是我们如何摆脱-2
,因为如果我们将-2
累积为无限个键,我们将耗尽我们的内存。当然,速度很慢。不需要额外的记忆——这相当于存在。好吧,我们已经有了答案,但是。。。它怎么能不需要额外的内存呢?在某个地方必须有一个数据结构,可以调用与计时器关联的键,否则系统如何记住将-2
放在何处?就实现而言,在redis中,我希望在某个地方存在类似Structure的字典,过期的密钥正在使用它的一个插槽。-2表示该密钥不存在-它可能已过期,也可能从未创建过(请参见我答案中的示例)。我知道如果我坚持,它会发生;)现在出去做真正的伤害吧!