2016-08-13 39 views
0

预计在Redis的下列行为,版本:2.8.19:Redis的关键设置为过期不实际删除

127.0.0.1:6380> set fooxyz 1 
OK 
127.0.0.1:6380> ttl fooxyz 
(integer) -1 
127.0.0.1:6380> expire fooxyz 3 
(integer) 1 
(1.98s) 
127.0.0.1:6380> ttl fooxyz 
(integer) 0 
127.0.0.1:6380> ttl fooxyz 
(integer) 0 
(0.96s) 
127.0.0.1:6380> ttl fooxyz 
(integer) 0 
127.0.0.1:6380> ttl fooxyz 
(integer) 0 
127.0.0.1:6380> get fooxyz 
"1" 

正如你所看到的,我设置的关键fooxyz的到期,它达到0,但之后它永远不会被删除。在到期时间之后,我仍然可以检索fooxyz的价值。

这是预期的吗?它最终会被删除/垃圾收集?

按照redis documentation

的关键是积极过期只是当一些客户端试图访问它, ,关键是发现超时。

但在这里我有一个积极尝试检索密钥的例子,它不会过期。

回答

0

esilver,我不能重现V3.2.2您的问题,懒惰到期优秀作品对我来说:

127.0.0.1:6379> set fooxyz 1 
OK 
127.0.0.1:6379> ttl fooxyz 
(integer) -1 
127.0.0.1:6379> expire fooxyz 3 
(integer) 1 
127.0.0.1:6379> ttl fooxyz 
(integer) -2 
127.0.0.1:6379> get fooxyz 
(nil) 
+0

你是否同意反复得到一个TTL值为0的关键是怪异而且 - 这是对被役使的高手,但一个Redis的过程不是只读的,这意味着我也可以写给奴隶,你认为这可能是相关的吗? – esilver

+0

是的,这很奇怪,我仍然无法在可写的奴隶中重新编写它。 –

0

@esilver 是的,这很奇怪。我仍然不能瑞普它放在一个可写的奴隶:(

127.0.0.1:6000> info replication 
# Replication 
role:slave  <======= 
master_host:127.0.0.1 
master_port:6001 
master_link_status:up 
master_last_io_seconds_ago:1 
master_sync_in_progress:0 
slave_repl_offset:24786 
slave_priority:100 
slave_read_only:0  <======= 
connected_slaves:0 
master_repl_offset:0 
repl_backlog_active:0 
repl_backlog_size:1048576 
repl_backlog_first_byte_offset:0 
repl_backlog_histlen:0 
127.0.0.1:6000> set fooxyz 1 
OK 
127.0.0.1:6000> ttl fooxyz 
(integer) -1 
127.0.0.1:6000> expire fooxyz 3 
(integer) 1 
127.0.0.1:6000> ttl fooxyz 
(integer) -2 
127.0.0.1:6000> get fooxyz 
(nil)