一尘不染

Redis dbsize命令的准确性

redis

dbsizeRedis中命令的准确性如何?

我注意到,返回的键dbsize数与keys命令返回的实际键数不匹配。

这是一个例子:

redis-cli dbsize
(integer) 3057
redis-cli keys "*" | wc -l
2072

为什么dbsize键数比实际数字高得多?


阅读 537

收藏
2020-06-20

共1个答案

一尘不染

我想说这与密钥到期有关。

键/值存储(例如Redis或memcached)无法为每个要过期的对象定义物理计时器。他们太多了。取而代之的是,他们定义一个数据结构以轻松跟踪要过期的项目,并将所有过期事件多路复用到单个物理计时器。他们还倾向于实施惰性策略来处理这些事件。

使用Redis,当某项过期时,什么也不会发生。但是,在访问每个项目之前,系统地进行检查以避免返回过期的项目,并有可能删除该项目。在此惰性策略的基础上,每100毫秒触发一次清除算法,以使许多项目实际失效(即从主词典中删除它们)。每次迭代中考虑的键的数量取决于到期工作量(算法是自适应的)。

结果是,当您有稳定的到期事件流时,Redis可能会积压要在给定时间点到期的项目。

现在回到问题所在,DBSIZE命令仅返回主字典的大小,因此它包括尚未删除的过期项目。KEYS命令遍历整个词典,访问各个键,因此它排除了所有过期的项目。因此,项目数可能不匹配。

2020-06-20