2016-08-13 37 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)