【发布时间】: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