我们通常使用命令dbsize来计数元素,使用过期。例如,为了计算在过去10秒内发生了多少X类型的事件,我们指定一个DB来计算这些元素,并将过期时间设置为10秒来插入它们。命令dbsize的值提供了元素的数量。
我知道过期的键不会反映在dbsize中,这就是为什么我们在该数据库中设置一个过期标志,例如,1秒。每次我们检查dbsize时,我们首先检查该标志是否已过期。如果过期,我们运行“key *”来刷新密钥的状态,并再次设置标志。这样我们就可以每秒刷新一次过期元素的状态,这样就不会给Redis带来太多的负载。它的元素不是很多,几百或几千。
然而,现在它不起作用了。也许在上一次实现中发生了一些变化。即使在执行“key *”之后,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在“key *”指示dbsize为空数据库后,需要很长一段时间才能真正更新它的值。
它破坏了我们所拥有的许多工作脚本的功能。
我正在Fedora 30上测试它: redis-5.0.7-1.fc30.x86_64
这在以前是有效的。什么改变了?
有什么想法吗?
发布于 2020-05-07 13:55:48
即使keys *没有返回密钥,您也可以尝试使用debug object kk1查看密钥是否仍在内存中。
我只能想到一种情况,在这种情况下,您描述的情况会发生:
您已经设置了lazyfree-lazy-expire yes
debug SET-ACTIVE-EXPIRE 0的配置
要检查lazyfree-lazy-expire,请尝试config get lazyfree-lazy-expire。
第二个无法咨询,但您可以执行debug SET-ACTIVE-EXPIRE 1以确保正常模式。
发布于 2020-05-08 00:52:51
好吧,我找不到一种方法来更新dbsize。
所以,我正在计算。我没有使用dbsize的结果,而是使用:
local allKeys = redis.call( "keys", "*" )
totalKeys = #allKeys - 1 -- -1 is for not counting totalKeys itself并将totalKeys重新插入Redis,以便在下次刷新之前使用该值。
https://stackoverflow.com/questions/61647548
复制相似问题