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

按数据库分段Redis

高豪
2023-03-14
问题内容

默认情况下,Redis配置了16个数据库,编号为0-15。这仅仅是名称间隔的一种形式,还是按数据库隔离会对性能产生影响?

例如,如果我使用默认数据库(0),并且有1000万个键,则最佳实践建议使用 keys
命令按通配符模式查找键效率低下。但是,如果我存储我的主键,也许是8个段键的前4个段,结果导致在单独的数据库(例如数据库3)中的键子集要小得多。Redis是将它们视为较小的一组密钥,还是所有数据库中的所有密钥都显示为一个巨大的密钥索引?

更明确地说,就时间复杂度而言,如果我的数据库如下所示:

  • 数据库0:10,000,000个密钥
  • 数据库3:10,000个密钥

针对数据库3 的 调用的时间复杂度是 O(10m) 还是 O(10k)

谢谢你的时间。


问题答案:

Redis为每个数据库都有一个单独的字典。在您的示例中,针对数据库3的键调用将为O(10K)

就是说,使用keys违反最佳实践。此外,对同一应用程序使用多个数据库也违反最佳实践。如果要遍历键,则应以应用程序特定的方式为它们编制索引。SortedSet是建立索引的好方法。

参考文献:

  1. 结构redisServer具有的html" target="_blank">数组redisDB。请参阅redis.h中的redisServer
  2. 每个redisDB都有自己的字典对象。在redis.h中查看redisDB
  3. keys该命令对当前数据库的字典进行操作


 类似资料:
  • 问题内容: 我的数据库中有以下3个表,在查询它们以获得所需结果时遇到了一些麻烦。我正在尝试按成分搜索食谱。 SQL Fiddle的以下模式: fiddle 这是我的桌子:配料 菜谱 成分索引 查询仅搜索一种成分的查询效果很好,并输出以下内容: 但是当使用或用于多种成分时,我们得到了 设置5行(0.00秒) 并没有使用“和”结果 任何帮助将非常感激! 问题答案: 由于配方可以使用多种成分,并且您正在

  • 问题内容: 我有一个看起来与此类似的MySQL数据库: 我需要在html表中对结果进行排序,如下所示: 我不知道这是否应该通过SQL查询(concat_group或类似的东西)或PHP完成,有人可以帮帮我吗? 伙计们,感谢您的以下帮助,但我还需要完成类似的工作,例如: 我需要对上面的示例进行排序/显示,如下所示: 现在,我的问题有了新的维度。我的数据库如下所示: (我正在使用表) 我需要实现: ¿

  • 问题内容: 我有一个Access 2013数据库表dbo_GOV 目标 我要使用USSenators字段,该字段包含类似(如下)的数据,并将其分别分为USSenator1和USSenator2字段: 问题 我尝试了几种不同的Access SQL查询…(在执行时都在下面),给出错误消息 无效使用’。’,’!’或’()’。在查询表达式’Split(USSenators&“;”,’;’)(0’中。 我已

  • 主要内容:语法,实例SQLite 的 DETACH DATABASE 语句是用来把命名数据库从一个数据库连接分离和游离出来,连接是之前使用 ATTACH 语句附加的。如果同一个数据库文件已经被附加上多个别名,DETACH 命令将只断开给定名称的连接,而其余的仍然有效。您无法分离 main 或 temp 数据库。 如果数据库是在内存中或者是临时数据库,则该数据库将被摧毁,且内容将会丢失。 语法 SQLite 的 DET

  • 分布式支持 数据访问层支持分布式数据库,包括读写分离,要启用分布式数据库,需要开启数据库配置文件中的deploy参数: return [ // 启用分布式数据库 'deploy' => 1, // 数据库类型 'type' => 'mysql', // 服务器地址 'hostname' => '192.168.1.1,19

  • 问题内容: 使用MySQL,如果我有一个字段,例如登录名,我将如何在sql命令中将该字段更新为1? 我正在尝试创建一个INSERT查询,该查询创建firstName,lastName和登录名。但是,如果firstName和lastName的组合已经存在,则将登录数增加1。 因此表格可能看起来像这样。 我需要一个命令,该命令在运行时会插入一个新的人(即Tom Rogers),或者如果使用约翰·琼斯的