我们通常使用命令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
这以前是有效的。什么改变了?
有什么想法吗?
2条答案
按热度按时间w46czmvw1#
嗯,我找不到更新dbsize的方法。
所以,我在数。我没有使用dbsize的结果,而是使用:
并将totalkeys插入redis,以便在下次刷新之前使用该值。
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
以确保正常模式。