【问题标题】:Why Redis DBSIZE command does not update even after executing "keys *"为什么 Redis DBSIZE 命令即使在执行“keys *”后也不更新
【发布时间】:2020-05-07 00:02:29
【问题描述】:

我们通常使用命令 dbsize 来计算元素,使用过期时间。例如,要计算过去 10 秒内发生了多少 X 类型的事件,我们专门使用一个 DB 来计算这些元素,并将它们插入并设置为 10 秒的过期时间。命令 dbsize 的值给出了元素的数量。

我知道过期的密钥不会反映在 dbsize 中,这就是我们在该数据库中设置一个标志的原因,例如过期时间为 1 秒。每次我们去检查 dbsize 时,我们首先检查那个标志是否已经过期。如果过期,我们运行“keys *”来刷新键的状态,并再次设置标志。这样我们每秒钟刷新一次过期元素的状态,以免给 Redis 带来太多负载。元素并不多,几百或几千个。

但是,现在它不起作用。也许在上一个实现中发生了一些变化。即使执行了“keys *”,dbsize 的值仍然没有更新。看:

我设置了三个值,有效期为 10 秒。

127.0.0.1:6379[20]> set kk1 1 ex 10
OK
127.0.0.1:6379[20]> set kk2 1 ex 10
OK
127.0.0.1:6379[20]> set kk3 1 ex 10
OK

检查所有键:

127.0.0.1:6379[20]> keys *
1) "kk1"
2) "kk2"
3) "kk3"

dbsize 返回 3:

127.0.0.1:6379[20]> dbsize
(integer) 3

密钥开始过期:

127.0.0.1:6379[20]> keys *
1) "kk2"
2) "kk3"
127.0.0.1:6379[20]> dbsize
(integer) 3

现在,问题来了:

127.0.0.1:6379[20]> keys *
(empty list or set)

"keys *" 已经反映了所有的key都过期了,所以数据库中没有key。但是,dbsize 没有更新。

127.0.0.1:6379[20]> dbsize
(integer) 3

在“keys *”指示空数据库后,dbsize 需要很长时间才能真正更新其值。

它破坏了我们拥有的许多工作脚本的功能。

我在 Fedora 30 上测试它:redis-5.0.7-1.fc30.x86_64

这以前有效。发生了什么变化?

有什么想法吗?

【问题讨论】:

    标签: redis


    【解决方案1】:

    你可以试试debug object kk1看看key是否还在内存中,即使keys *没有返回。

    我只能想到你所描述的会发生的一种情况:

    1. 您已设置配置lazyfree-lazy-expire yes
    2. 你已经完成了debug SET-ACTIVE-EXPIRE 0

    要检查lazyfree-lazy-expire,请尝试config get lazyfree-lazy-expire

    第二个不能咨询,但是你做debug SET-ACTIVE-EXPIRE 1保证正常模式。

    【讨论】:

    • 你好,里奥。 lazyfree-lazy-expire 设置为 no。我从未修改过 SET-ACTIVE-EXPIRE,但以防万一我执行了“调试 SET-ACTIVE-EXPIRE 1”,但没有任何效果。仍然没有更新 dbsize: 127.0.0.1:6379[20]> keys * (empty list or set) 127.0.0.1:6379[20]> dbsize (integer) 3 我之前没有修改过任何东西。它只是使用 dnf (yum) 安装的标准 Redis。我只是更改了数据库的数量。
    • 您将数据库设置为多少?该行为将是一个错误
    • 10.000 个数据库。这只是为了测试。该数字不应影响 dbsize 的行为。
    【解决方案2】:

    好吧,我找不到更新 dbsize 的方法。

    所以,我在数。我没有使用 dbsize 的结果:

    local allKeys = redis.call( "keys", "*" )
    totalKeys = #allKeys - 1 -- -1 is for not counting totalKeys itself
    

    然后将 totalKeys 插入 Redis,以使用该值直到下次刷新。

    【讨论】:

      猜你喜欢
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 2017-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      相关资源
      最近更新 更多