2012-02-09 42 views
1

redis中的dbsize命令的准确性如何?redis dbsize命令的准确性

我注意到由dbsize返回的密钥数量与keys命令返回的实际密钥数量不匹配。

下面是一个例子:

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

为什么dbsize所以按键,比实际数字要高得多?

+1

你过期了吗?一个区别是dbsize只是返回主字典中的密钥数量而不排除过期的密钥,而keys命令在返回之前系统地检查给定的密钥是否过期。 – 2012-02-09 23:57:21

+0

是的,我过期了我的钥匙。这就解释了它。如果您将此作为答案提交,我会接受它。谢谢! – 2012-02-10 03:01:26

回答

2

我会说它是关键到期。

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

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

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

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