多个Redis数据库有什么意义?

Eli*_*Eli 139 redis

所以,我来到一个地方,我想将我在redis中存储的数据分割成单独的数据库,因为我有时需要在一种特定类型的数据上使用keys命令,并希望将它分开以使其更快.

如果我分成多个数据库,一切仍然是单线程的,我仍然只能使用一个核心.如果我只是在同一个盒子上启动另一个Redis实例,我会使用额外的核心.最重要的是,我不能命名Redis数据库,或者给它们任何更多的逻辑标识符.所以,所有这些都说明了为什么/什么时候我想要使用多个Redis数据库,而不是仅为我想要的每个额外数据库启动一个额外的Redis实例?相关地,为什么Redis不会为我添加的每个额外数据库使用额外的核心?跨数据库进行单线程的优势是什么?

The*_*ill 86

您不希望在单个redis实例中使用多个数据库.它已弃用,如您所述,多个实例可让您利用多个核心.如果使用数据库选择,则必须在升级时进行重构.监视和管理多个实例既不困难也不痛苦.

实际上,通过基于实例的隔离,您可以在每个数据库上获得更好的指标.每个实例都有反映该数据段的统计数据,这可以实现更好的调整和更快速响应和准确的监控.使用最新版本并按实例分隔您的数据.

正如Jonaton所说,不要使用keys命令.如果您只是创建一个密钥索引,您会发现更好的性能.每次添加密钥时,都要将密钥名称添加到集合中.一旦放大,keys命令就不是非常有用,因为它需要很长时间才能返回.

让访问模式决定如何构建数据,而不是按照您认为的方式存储它,然后解决如何访问和稍后删除它.您将看到更好的性能,并且发现数据消耗代码通常更清晰,更简单.

关于单线程,请考虑redis是为速度和原子性而设计的.修改一个数据库中的数据的操作无需等待另一个数据库,但如果该操作保存到转储文件或处理从服务器上的事务怎么办?那时你开始进入并发编程的杂草.

通过使用多个实例,您可以将多线程复杂性转换为更简单的消息传递样式系统.

  • 不推荐使用多个数据库?您能否为该声明提供参考.我知道Redis Cluster不支持多个数据库,但它们都不是任何复杂的多键命令,并且它们不会被弃用. (51认同)
  • [来自Redis的"所有者"(根据Google Code)的一些(强有力的)证据](https://code.google.com/p/redis/issues/detail?id=662#c4)"......即使我过去曾表示他们会这样做,数据库也不会被弃用." (24认同)
  • -1表示已弃用的语句.可能不鼓励使用多个数据库,并且redis-cluster中不支持这些数据库,但不会弃用它们. (22认同)
  • 您将无法在redis-cluster上使用多个redis数据库.除此之外,多个数据库仍然是一个东西. (3认同)

raf*_*ian 72

原则上,同一实例上的Redis数据库与RDBMS数据库实例中的模式没有什么不同.

所以,所有这些都说明了为什么/什么时候我想要使用多个Redis数据库,而不是仅为我想要的每个额外数据库启动一个额外的Redis实例?

在同一个redis实例中使用redis数据库有一个明显的优势,那就是管理.如果你为每个应用程序启动一个单独的实例,并且假设你有3个应用程序,那就是3个独立的redis实例,每个实例都可能需要一个生产中的HA从属设备,因此共有6个实例.从管理的角度来看,这很快就会变得凌乱,因为你需要监控所有这些,进行升级/补丁等.如果你不打算用高I/O重载redis,那么带有slave的单个实例就更简单了.只要符合您的SLA,便于管理.

  • 多个Redis实例始终是可行的方法.期.对不同的数据运行并行查询.如果您的CICD管道没有为您创建缓存集群,请修复它,而不是.....你明白了 (24认同)
  • 这并没有解决OP的问题:(1)为什么Redis不尝试为每个额外的数据库使用一个额外的核心?(2)跨数据库单线程有什么好处? (4认同)
  • 不使用多个数据库的另一个原因:redis集群不支持多个数据库。https://redis.io/docs/reference/cluster-spec/#implemented-subset (3认同)

Nir*_*mal 50

即使是Salvatore Sanfilippo(Redis的创建者)也认为在Redis中使用多个DB是个坏主意.在这里看到他的评论:

https://groups.google.com/d/topic/redis-db/vS5wX8X4Cjg/discussion

我理解这是如何有用的,但遗憾的是我认为Redis的多个数据库错误是我在Redis设计中最糟糕的决定......没有任何实际的好处,它会使内部组件变得更加复杂.实际情况是,数据库由于多种原因而无法很好地扩展,例如密钥和VM的活动过期.如果可以使用字符串执行数据库选择,我可以看到此功能被用作可扩展的O(1)字典层,而不是.

对于DB编号,默认为几个DB,我们更好地沟通了这个功能以及如何使用我认为.我希望在某些时候我们可以放弃多个DB支持,但我认为可能为时已晚,因为有很多人依赖这个功能来完成他们的工作.

  • 坚持下去,所以使用数据库选择实际上比仅使用前缀效率低?这句话在这里意味着什么(有人可以澄清一下)吗?"如果可以使用字符串执行数据库选择,我可以看到此功能被用作可扩展的O(1)字典层,而不是." (3认同)
  • 这实际上并不是说“使用”它们是一个坏主意。它说,对他来说,一开始就加入这个选项是个坏主意。 (2认同)

Ral*_*ton 10

我知道这个问题已经有很多年了,但是多个数据库可能有用还有另一个原因。

如果您使用您最喜欢的云提供商提供的“云 Redis”,您可能有最小内存大小,并且需要为您分配的内存付费。然而,如果您的数据集小于该值,那么您将浪费一些分配,从而浪费一些钱。

使用数据库,您可以使用相同的 Redis 云实例来为(例如)开发、UAT 和生产、或应用程序的多个实例或其他任何服务提供服务 - 因此使用更多分配的内存,因此成本更高一些 -有效的。

我正在查看的用例有多个应用程序实例,每个实例使用 200-300K,但我的云提供商的最小分配量是 1M。我们可以将 10 个实例整合到一个 Redis 上,而不会真正削弱任何限制,从而节省大约 90% 的 Redis 托管成本。我知道这种方法存在局限性和问题,但认为值得一提。

  • 我认为在同一个 Redis 实例中组合生产、开发和 UAT 的用例忽略了允许 QA 和开发人员访问生产数据的安全隐患 (5认同)
  • 同意 - 在任何“严肃”的环境中,对非产品和产品使用相同的 redis 服务器可能是一个糟糕的举动。在较小的商店中可能可以混合 dev/uat,但你的观点很好。多个 Redis 数据库只允许这样做 - 这并不是一个好主意;-) (4认同)

小智 7

Redis 数据库可用于部署应用程序新版本的极少数情况,其中新版本需要与不同的实体配合使用。


Jon*_*org 6

  1. 我真的不知道在单个实例上拥有多个数据库有什么好处.我想如果多个服务使用相同的数据库服务器是有用的,那么您可以避免关键冲突.

  2. 我不建议使用KEYS命令构建,因为它是O(n)并且不能很好地扩展.你用什么方式可以用另一种方式完成?如果像这样的功能KEYS至关重要,也许redis不是最适合你的.

  3. 我认为他们在常见问题解答中提到了单线程服务器的好处,但主要是简单性 - 您不必以任何真实的方式打扰并发性.每个操作都是阻塞的,因此没有两件事可以同时改变数据库.理想情况下,每个服务器的每个核心都有一个(或多个)实例,并使用一致的散列算法(或代理)在它们之间划分密钥.当然,你会失去一些功能 - 管道只适用于同一台服务器上的东西,分类变得更难等.