redis中dbsize
命令的准确度如何?
我注意到dbsize
返回的密钥数与keys
命令返回的实际密钥数不匹配。
以下是一个例子:
redis-cli dbsize
(integer) 3057
redis-cli keys "*" | wc -l
2072
为什么dbsize
比实际的键数高得多?
答案 0 :(得分:4)
我会说它与密钥到期有关。
像Redis或memcached这样的键/值存储无法定义每个对象到期的物理计时器。它们会太多了。相反,他们定义数据结构以轻松跟踪要过期的项目,并将所有过期事件多路复用到单个物理计时器。他们也倾向于实施一种懒惰的策略来处理这些事件。
使用Redis,当一个项目到期时,没有任何反应。但是,在每个项目访问之前,系统地进行检查以避免返回过期的项目,并可能删除该项目。除了这个懒惰的策略之外,每100毫秒,一个清道夫算法被触发以物理地过期许多项目(即从主词典中删除它们)。每次迭代时考虑的密钥数量取决于到期工作负载(算法是适应性的)。
结果是,当您有一个稳定的到期事件流时,Redis可能会有一个积压的项目在给定的时间点到期。
现在回到这个问题,DBSIZE命令只返回主字典的大小,因此它包含尚未删除的过期项目。 KEYS命令遍历整个字典,访问各个键,因此它排除了所有过期的项目。因此,商品数量可能不匹配。