redis dbsize 命令的准确性

Ike*_*ker 3 redis

dbsizeredis中的命令有多准确?

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

下面是一个例子:

redis-cli dbsize
(integer) 3057
redis-cli keys "*" | wc -l
2072
Run Code Online (Sandbox Code Playgroud)

为什么dbsize比实际键数高出这么多?

Did*_*zia 5

我会说它与密钥过期有关。

像 Redis 或 memcached 这样的键/值存储不能为每个对象定义一个物理计时器来过期。他们会太多。相反,他们定义了一个数据结构来轻松跟踪要过期的项目,并将所有过期事件多路复用到单个物理计时器。他们还倾向于实施一种懒惰的策略来处理这些事件。

使用 Redis,当项目过期时,什么也不会发生。但是,在每个项目访问之前,都会系统地进行检查以避免返回过期项目,并可能删除该项目。在这种惰性策略之上,每 100 毫秒,一个清道夫算法被触发以物理使许多项目过期(即从主字典中删除它们)。每次迭代中考虑的密钥数量取决于到期工作负载(算法是自适应的)。

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

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