首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Redis DBSIZE命令在执行"keys *“后仍不更新

为什么Redis DBSIZE命令在执行"keys *“后仍不更新
EN

Stack Overflow用户
提问于 2020-05-07 08:02:30
回答 2查看 242关注 0票数 0

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

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

然而,现在它不起作用了。也许在上一次实现中发生了一些变化。即使在执行“key *”之后,dbsize的值仍然不会更新。看:

我设置了三个值,过期时间为10秒。

代码语言:javascript
复制
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

检查所有密钥:

代码语言:javascript
复制
127.0.0.1:6379[20]> keys *
1) "kk1"
2) "kk2"
3) "kk3"

dbsize返回3:

代码语言:javascript
复制
127.0.0.1:6379[20]> dbsize
(integer) 3

密钥开始过期:

代码语言:javascript
复制
127.0.0.1:6379[20]> keys *
1) "kk2"
2) "kk3"
127.0.0.1:6379[20]> dbsize
(integer) 3

现在,问题来了:

代码语言:javascript
复制
127.0.0.1:6379[20]> keys *
(empty list or set)

"keys *“已经反映出所有密钥都已过期,因此数据库中没有密钥。但是,dbsize没有更新。

代码语言:javascript
复制
127.0.0.1:6379[20]> dbsize
(integer) 3

在“key *”指示dbsize为空数据库后,需要很长一段时间才能真正更新它的值。

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

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

这在以前是有效的。什么改变了?

有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2020-05-07 13:55:48

即使keys *没有返回密钥,您也可以尝试使用debug object kk1查看密钥是否仍在内存中。

我只能想到一种情况,在这种情况下,您描述的情况会发生:

您已经设置了lazyfree-lazy-expire yes

  • You debug SET-ACTIVE-EXPIRE 0

的配置

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

第二个无法咨询,但您可以执行debug SET-ACTIVE-EXPIRE 1以确保正常模式。

票数 1
EN

Stack Overflow用户

发布于 2020-05-08 00:52:51

好吧,我找不到一种方法来更新dbsize。

所以,我正在计算。我没有使用dbsize的结果,而是使用:

代码语言:javascript
复制
local allKeys = redis.call( "keys", "*" )
totalKeys = #allKeys - 1 -- -1 is for not counting totalKeys itself

并将totalKeys重新插入Redis,以便在下次刷新之前使用该值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61647548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档