为什么redis dbsize命令即使在执行“keys*之后也不更新

bvpmtnay  于 2021-06-09  发布在  Redis
关注(0)|答案(2)|浏览(497)

我们通常使用命令dbsize来计数元素,使用expiration。例如,为了计算在过去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*”已经反映所有密钥都过期了,因此数据库中没有密钥。但是,dbsize没有更新。

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

在“keys*”指示dbsize的空数据库之后,需要很长时间才能真正更新其值。
它破坏了我们拥有的许多工作脚本的功能。
我正在Fedora30上测试它:redis-5.0.7-1.fc30.x86\u 64
这以前是有效的。什么改变了?
有什么想法吗?

w46czmvw

w46czmvw1#

嗯,我找不到更新dbsize的方法。
所以,我在数。我没有使用dbsize的结果,而是使用:

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

并将totalkeys插入redis,以便在下次刷新之前使用该值。

bejyjqdl

bejyjqdl2#

你可以试试 debug object kk1 查看密钥是否仍在内存中,即使未由返回 keys * .
我只能想到一个你所描述的情况:
您已设置配置 lazyfree-lazy-expire yes 你已经做到了 debug SET-ACTIVE-EXPIRE 0 检查 lazyfree-lazy-expire ,试试看 config get lazyfree-lazy-expire .
第二个不能咨询,但你可以 debug SET-ACTIVE-EXPIRE 1 以确保正常模式。

相关问题