当前位置: 首页 > 面试题库 >

Redis dbsize命令的准确性

宓和同
2023-03-14
问题内容

dbsizeRedis中命令的准确性如何?

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

这是一个例子:

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

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


问题答案:

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

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

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

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

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



 类似资料:
  • Go语言的1.5版本在标准命令方面有了重大变更。这倒不是说它们的用法有多大的变化,而是说它们的底层支持已经大变样了。让我们先来对比一下$GOROOT/pkg/tool/<平台相关目录>中的内容。以下简称此目录为Go工具目录。 插播:平台相关目录即以_命名的目录,用于存放因特定平台的不同而不同的代码包归档文件或可执行文件。其中,代表特定平台的操作系统代号,而则代表特定平台的计算架构代号。使用go e

  • 问题内容: 假设我想对两个程序进行基准测试:foo.py和bar.py。 有一对夫妇一千运行和各自的平均值和充足的足够分析和比较他们的速度? 编辑: 此外,如果每个程序的执行时间都不到一秒(假设不是以上所述),则可以使用吗? 问题答案: 对于运行一秒钟的基准测试,它可以产生足够好的时间,否则,与运行时间相比,该过程花费的时间可能会很大。 但是,在进行基准测试时,应注意上下文切换。也就是说,另一个进

  • 例如,“sudo”是ctor的第一个参数、最后一个参数还是其他参数?您如何知道它们的位置以及命令的哪些元素成为的参数?

  • 问题内容: 我们的网站使用Apache Velocity 模板语言。我们的内容管理系统已经检查了所有生成的XML文档的格式是否正确。我们被要求在将文件推送到实际站点之前检查文档以捕获Velocity语法错误。 是否有从命令行验证Velocity模板正确性的标准方法? 我准备读入模板路径,初始化Velocity Engine,解析模板,并捕获所有错误,如本页上所示,但是如果有现成的工具可以获取文件和

  • 所以我为我的不和谐机器人做了一个静音命令,它会发现是否存在一个“静音”角色,如果不存在,机器人会创建一个“静音”角色,然后把这个角色给提到的成员,目前当我运行命令时,它只给我一个如果命令写入错误,它应该发送的嵌入。 我仍然无法找出问题所在以及原因,我非常想知道代码中的错误以及是否还有我不知道的错误。

  • 问题内容: 我找不到带redis的HGET,HSET(哈希表命令)基准标记的示例。任何示例或资源都将对此有用。 问题答案: 我只是意识到命令没有基准和命令。(我正在使用v2.8.5) 您可以做的是编写一个小程序来对性能进行基准测试: 在我的测试服务器上,结果如下: