按数据库对 Redis 进行分段



默认情况下,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违背了最佳实践。此外,对同一应用程序使用多个数据库也违反了最佳实践。如果要循环访问键,则应以特定于应用程序的方式为它们编制索引。排序集是构建索引的好方法。

引用:

  1. 结构redisServer具有一系列redisDB。参见 redis.h 中的 redisServer
  2. 每个redisDB都有自己的字典对象。参见 redis.h 中的 redisDB
  3. keys命令对当前数据库的字典进行操作

最新更新