Redis从站上info命令列出的到期密钥数与我看到的不一致

当我inforedis-cliredis 3.2.4服务器上运行命令时,它显示了过期时间:

expires=223518

但是,当我随后运行keys *命令并要求ttl每个键都输入并且仅打印ttl> 0的键时,我只会看到几百个。

我以为这expires是对即将到期的密钥数量的计数,但是我什至不在这个数量级的数量级之内。

有人可以明确说明expires要传达的意思吗?这是否包括将要过期和先前已过期但尚未收回的密钥?


更新:

这是我计算密钥过期数量的方法:

  task count_tmp_keys: :environment do

redis = Redis.new(timeout: 100)

keys = redis.keys '*'

ct_expiring = 0

keys.each do |k|

ttl = redis.ttl(k)

if ttl > 0

ct_expiring += 1

puts "Expiring: #{k}; ttl is #{ttl}; total: #{ct_expiring}"

STDOUT.flush

end

end

puts "Total expiring: #{ct_expiring}"

puts "Done at #{Time.now}"

end

当我运行此脚本时,它表明我的总寿命为78

当我运行信息时,它说 db0:keys=10237963,expires=224098,avg_ttl=0

因为224098比78大得多,所以我很困惑。对于我来说,是否有更好的方法来获取所有225k过期密钥的列表?

另外,我的平均ttl为0怎么办?您不希望它不为零吗?


我有新的信息,并且在本地对此情况进行了简单的100%复制!

要进行复制:在笔记本电脑上本地设置两个Redis进程。使一个成为另一个的奴隶。在从属进程上,设置以下内容:

config set slave-serve-stale-data yes

config set slave-read-only no

现在,连接到从服务器(不是主服务器)并运行:

set foo 1

expire foo 10

10秒后,您将不再能够访问foo,但info命令仍将显示您有1个密钥已到期,平均ttl为0。

有人可以解释这种行为吗?

回答:

expires包含将过期的现有TTL密钥,不包括已过期的密钥。示例(info为简洁起见,省略了命令中的其他信息):

127.0.0.1:6379> flushall

OK

127.0.0.1:6379> SETEX mykey1 1000 "1"

OK

127.0.0.1:6379> SETEX mykey2 1000 "2"

OK

127.0.0.1:6379> SETEX mykey3 1000 "3"

OK

127.0.0.1:6379> info

# Keyspace

db0:keys=3,expires=3,avg_ttl=992766

127.0.0.1:6379> SETEX mykey4 1 "4"

OK

127.0.0.1:6379> SETEX mykey5 1 "5"

OK

127.0.0.1:6379> info

# Keyspace

db0:keys=3,expires=3,avg_ttl=969898

127.0.0.1:6379> keys *

1) "mykey2"

2) "mykey3"

3) "mykey1"

127.0.0.1:6379>

鉴于您的情况,您会根据https://github.com/antirez/redis/issues/2861询问有关奴隶的密钥到期的信息:

从属服务器上的密钥未主动过期,因此从不计算avg_ttl

并按照https://groups.google.com/forum/#!topic/redis-

db/NFTpdmpOPnc进行操作:

avg_ttl永远不会在从属服务器上初始化,因此它可以是任意值驻留在该位置的内存中的任何值。

因此,可以预期该info命令在从站上的行为会有所不同。

以上是 Redis从站上info命令列出的到期密钥数与我看到的不一致 的全部内容, 来源链接: utcz.com/qa/400380.html

回到顶部