准确度如何dbsize
redis 中的命令?
我注意到返回的键数dbsize
与返回的实际键数不匹配keys
命令。
这是一个例子:
redis-cli dbsize
(integer) 3057
redis-cli keys "*" | wc -l
2072
Why is dbsize
比实际的按键数量多这么多?
我想说这与密钥过期有关。
像 Redis 或 memcached 这样的键/值存储无法为每个对象定义一个过期的物理计时器。他们的人数太多了。相反,他们定义了一个数据结构来轻松跟踪要过期的项目,并将所有过期事件复用到单个物理计时器。他们还倾向于实施惰性策略来处理这些事件。
使用 Redis,当某个项目过期时,不会发生任何事情。但是,在访问每个项目之前,都会系统地进行检查,以避免返回过期的项目,并可能删除该项目。在这种惰性策略之上,每 100 毫秒就会触发一个清道夫算法,使许多项目物理过期(即从主字典中删除它们)。每次迭代时考虑的键的数量取决于过期工作负载(该算法是自适应的)。
结果是,当您有稳定的过期事件流时,Redis 可能会积压在给定时间点过期的项目。
现在回到问题,DBSIZE 命令只返回主字典的大小,因此它包括尚未删除的过期项目。 KEYS 命令遍历整个字典,访问各个键,因此它排除所有过期的项目。因此,项目数量可能不匹配。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)