219

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

如果我分割成多个数据库,一切仍然是单线程的,我仍然只能使用一个内核。如果我只是在同一个盒子上启动另一个 Redis 实例,我就可以使用一个额外的核心。最重要的是,我不能命名 Redis 数据库,或者给它们任何更合乎逻辑的标识符。那么,综上所述,为什么/何时我想要使用多个 Redis 数据库,而不是为我想要的每个额外数据库启动一个额外的 Redis 实例?与此相关的是,为什么 Redis 不尝试为我添加的每个额外数据库使用一个额外的核心?跨数据库单线程有什么好处?

4

8 回答 8

119

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

那么,综上所述,为什么/何时我想要使用多个 Redis 数据库,而不是为我想要的每个额外数据库启动一个额外的 Redis 实例?

在同一个 redis 实例中使用 redis 数据库有一个明显的优势,那就是管理。如果您为每个应用程序启动一个单独的实例,假设您有 3 个应用程序,那就是 3 个单独的 redis 实例,每个实例都可能需要一个从属服务器来实现生产中的 HA,所以总共有 6 个实例。从管理的角度来看,这很快就会变得一团糟,因为您需要监控所有这些,进行升级/补丁等。如果您不打算用高 I/O 重载 redis,带有从属的单个实例更简单,并且如果它符合您的 SLA,则更易于管理。

于 2013-04-25T20:03:22.010 回答
118

您不想在单个 redis 实例中使用多个数据库。正如您所指出的,多个实例可让您利用多个核心。如果您使用数据库选择,您将不得不在升级时进行重构。监控和管理多个实例并不困难也不痛苦。

实际上,通过基于实例的隔离,您将在每个数据库上获得更好的指标。每个实例都有反映该数据段的统计信息,这可以进行更好的调整以及更灵敏和更准确的监控。使用最新版本并按实例分离数据。

正如 Jonaton 所说,不要使用 keys 命令。如果您简单地创建一个键索引,您会发现性能要好得多。每当添加密钥时,将密钥名称添加到集合中。放大后,keys 命令并不是非常有用,因为它需要很长时间才能返回。

让访问模式决定如何构建数据,而不是按照您认为可行的方式存储数据,然后解决以后如何访问和切碎数据。您将看到更好的性能,并发现消耗数据的代码通常更干净、更简单。

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

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

于 2013-04-26T19:26:10.447 回答
78

甚至 Salvatore Sanfilippo(Redis 的创建者)也认为在 Redis 中使用多个数据库是个坏主意。在这里查看他的评论:

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

我知道这很有用,但不幸的是,我认为 Redis 多个数据库错误是我在 Redis 设计中最糟糕的决定……没有任何真正的收获,它使内部结构变得更加复杂。现实情况是,由于多种原因,数据库无法很好地扩展,例如密钥和 VM 的主动过期。如果可以使用字符串执行 DB 选择,我可以看到此功能被用作可扩展的 O(1) 字典层,但事实并非如此。

使用 DB 编号,默认为几个 DB,我们可以更好地沟通此功能是什么以及我认为如何使用。我希望在某个时候我们可以完全放弃对多数据库的支持,但我认为这可能为时已晚,因为有很多人在工作中依赖此功能。

于 2016-04-08T11:35:57.527 回答
8
  1. 我真的不知道在单个实例上拥有多个数据库有什么好处。我想如果多个服务使用相同的数据库服务器会很有用,这样你就可以避免密钥冲突。

  2. 我不建议使用该KEYS命令进行构建,因为它是 O(n) 并且不能很好地扩展。你用它来做什么,你可以用另一种方式完成?KEYS如果像这样的功能至关重要,那么 redis 可能不是你的最佳选择。

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

于 2013-04-25T18:49:37.700 回答
2

我正在使用 redis 来实现电子邮件地址的黑名单,并且对于不同级别的黑名单,我有不同的 TTL 值,因此在同一实例上拥有不同的数据库对我有很大帮助。

于 2015-03-24T12:29:46.380 回答
2

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

于 2015-06-15T12:04:23.713 回答
2

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

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

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

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

于 2020-05-22T10:42:13.240 回答
0

在单个实例中使用多个数据库在以下场景中可能很有用:

同一数据库的不同副本可用于使用实时数据进行生产、开发或测试。人们可能会使用副本来克隆一个 redis 实例以达到相同的目的。但是,前一种方法更容易让现有运行程序只需选择正确的数据库即可切换到预期模式。

于 2019-04-10T12:56:42.440 回答