redis - redis slave 上 info 命令列出的过期键数与我看到的不一致

标签 redis

当我在 redis-cli 中针对 redis 3.2.4 服务器运行 info 命令时,它会显示过期时间:

expires=223518

但是,当我随后运行 keys * 命令并为每个键请求 ttl 并且只打印出 ttl > 0 的键时,我只看到几百。

我认为 expires 是对过期 key 数量的计数,但我什至不在这个数字的数量级内。

有人能准确说明 expires 的意思吗?这是否包括即将过期和之前已过期但尚未被驱逐的 key ?


更新:

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

  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 过期 key 的列表?

另外,我的平均 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 个 key 过期,平均 ttl 为 0。

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

最佳答案

expires 包含将过期的具有 TTL 的现有 key ,不包括已经过期的 key 。 示例(为简洁起见,省略了 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> 

鉴于在您的情况下,您询问的是奴隶的 key 到期时间,根据 https://github.com/antirez/redis/issues/2861 :

keys on a slave are not actively expired, and thus the avg_ttl is never calculated

根据https://groups.google.com/forum/#!topic/redis-db/NFTpdmpOPnc :

avg_ttl is never initialized on a slave and thus it can be what ever arbitrary value resides in memory at that place.

因此,info 命令在从站上的行为不同是可以预料的。

关于redis - redis slave 上 info 命令列出的过期键数与我看到的不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45844944/

相关文章:

database - 图数据库返回社交网络中两个人的共同 friend 列表

python - redis 值需要转换为 dict

redis - 控制台上有奇怪的 REDIS 字符?

php - redis-cli flushall 的 bash 命令是什么?

java - 为什么 RMap 接口(interface)没有 removeAll 方法?批量删除最方便的方法是什么?

python - 如何正确地对 Python 脚本连接到 Redis 所需的时间进行基准测试?

shell - Redis 按哈希值中的模式删除哈希键

ruby-on-rails - 如何设置和获取存储在 Redis 中的对象?

ruby - 开箱即用的 Redis-RB 在本地抛出 ECONNREFUSED 错误

Scala-Redis 库不包含在 fat jar 文件中