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

时间:2013-04-25 17:59:07

标签: redis

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

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

8 个答案:

答案 0 :(得分:82)

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

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

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

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

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

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

答案 1 :(得分:67)

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

  

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

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

答案 2 :(得分:47)

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

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

  

我理解这是如何有用的,但不幸的是我考虑过   Redis多个数据库错误是Redis设计中最糟糕的决定   所有...没有任何实际收益,它使内部很多   更复杂。现实情况是数据库不能很好地扩展   理由数量,如密钥和VM的活动过期。如果是DB   可以使用字符串执行选择我可以看到此功能   用作可扩展的O(1)字典层,而不是它。

     

使用DB编号,默认为几个DB,我们是通信   更好的是这个功能是什么,我认为如何使用。我希望   在某些时候,我们可以放弃多个DB支持,但我认为   可能为时已晚,因为有很多人依赖于此   他们的工作特色。

答案 3 :(得分:6)

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

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

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

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

使用数据库,您可以使用相同的Redis云实例来为(例如)开发,UAT和生产或应用程序的多个实例或其他任何事物提供服务-这样就可以使用更多分配的内存,从而节省了一点更具成本效益。

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

答案 7 :(得分:0)

在以下情况下,在单个实例中使用多个数据库可能很有用:

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