小编典典

按数据库分段Redis

redis

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

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

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

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

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

谢谢你的时间。


阅读 440

收藏
2020-06-20

共1个答案

小编典典

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

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

参考文献:

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