什么's点的多个Redis数据库?

所以,我来到了一个地方,我想把我存储在redis的数据分割成单独的数据库,因为我有时需要在一种特定的数据上使用键命令,并想把它分开,以使其更快。

如果我分割成多个数据库,所有内容仍然是单线程的,而且我仍然只能使用一个核心。如果我只是在同一个盒子上启动另一个Redis实例,我就可以使用一个额外的核心。最重要的是,我不能给Redis数据库命名,也不能给它们任何更符合逻辑的标识符。所以,说了这么多,为什么/什么时候我想要使用多个Redis数据库,而不是为每个我想要的额外数据库旋转一个额外的Redis实例?与此相关的是,为什么Redis不尝试为我添加的每一个额外数据库使用一个额外的核心呢?单线程跨数据库的优势是什么?

112117 次浏览
  1. 我真的不知道在一个实例上拥有多个数据库有什么好处。我认为,如果多个服务使用相同的数据库服务器,那么可以避免键冲突。

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

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

原则上,相同实例上的Redis数据库与RDBMS数据库实例中的模式没有区别。

所以,说了这么多,为什么/什么时候我想要使用倍数 Redis数据库,而不是仅仅旋转一个额外的Redis实例 为我想要的每个额外数据库?< / p >

在同一个redis实例中使用redis数据库有一个明显的优势,那就是管理。如果您为每个应用程序启动一个单独的实例,假设您有3个应用程序,那么就有3个单独的redis实例,每个实例都可能需要一个用于生产中的HA的从服务器,因此总共有6个实例。从管理的角度来看,这很快就会变得混乱,因为你需要监控所有这些,进行升级/补丁等。如果您不打算重载具有高I/O的redis,那么在满足您的SLA的前提下,具有从机的单个实例更简单、更容易管理。

你不希望在一个redis实例中使用多个数据库。正如您所指出的,多个实例使您可以利用多个内核。如果使用数据库选择,则升级时必须进行重构。监视和管理多个实例并不困难,也不痛苦。

实际上,通过基于实例的隔离,您可以获得对每个db更好的度量。每个实例都有反映该数据段的统计信息,这可以实现更好的调优、响应更及时、更准确的监控。使用最新版本并按实例分隔数据。

正如Jonaton所说,不要使用按键命令。如果您只是创建一个键索引,您将发现更好的性能。无论何时添加键,都要将键名添加到集合中。keys命令在扩展后并不是特别有用,因为返回它将花费大量时间。

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

对于单线程,考虑redis是为速度和原子性而设计的。当然,在一个db中修改数据的操作不需要等待另一个db,但是如果该操作保存到转储文件中,或者在slave上处理事务呢?在这一点上,您开始进入并发编程的杂草。

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

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

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

甚至Salvatore Sanfilippo (Redis的创造者)也认为在Redis中使用多个db是一个坏主意。点击这里查看他的评论:

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

我知道这是多么有用,但不幸的是,我认为 Redis多个数据库错误,我在Redis设计中最糟糕的决定 所有……没有任何真正的收获,它使内部很多 更加复杂。现实情况是数据库不能很好地扩展 原因的数量,如活动到期的密钥和虚拟机。如果DB 选择可以用字符串执行,我可以看到这个功能 用作可伸缩的O(1)字典层,而不是。< / p >

使用DB编号,默认为几个DB,我们正在通信 我认为这个功能是什么以及如何使用。我希望 在某种程度上,我们可以完全放弃对多个db的支持,但我认为 可能已经太迟了,因为有很多人依赖于此

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

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

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

如果你使用你最喜欢的云提供商的“云Redis”,你可能有一个最小的内存大小,并将为你分配的内存付费。然而,如果你的数据集比这个小,那么你就会浪费一些分配,因此也会浪费一些钱。

使用数据库,您可以使用相同的Redis云实例为(比如说)开发、UAT和生产提供服务,或者应用程序的多个实例,或者其他任何东西——这样可以使用更多的已分配内存,因此更划算。

我正在研究的一个用例有几个应用程序实例,每个实例使用20 - 300k,但我的云提供商上的最小分配是1M。我们可以将10个实例合并到一个Redis上,而不受任何限制,因此可以节省大约90%的Redis托管成本。我知道这种方法有局限性和问题,但我认为值得一提。