多个Redis数据库的意义何在?

nom7f22z  于 2022-10-08  发布在  Redis
关注(0)|答案(8)|浏览(244)

因此,我想要将存储在redi中的数据分段到单独的数据库中,因为我有时需要对一种特定类型的数据使用key命令,并希望将其分开以使速度更快。

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

vwkv1x7d

vwkv1x7d1#

您不希望在单个redis示例中使用多个数据库。正如您所提到的,多个示例让您能够利用多个核心。如果您使用数据库选择,则在升级时必须进行重构。监控和管理多个示例并不困难,也不痛苦。

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

正如乔纳顿所说,不要使用KEYS命令。如果只创建一个键索引,您会发现性能要好得多。每次添加关键点时,都会将关键点名称添加到集合中。一旦扩展,KEYS命令就不是特别有用了,因为它需要很长时间才能恢复。

让访问模式决定如何组织数据,而不是以您认为的工作方式存储数据,然后解决如何在以后访问和备份数据。您将看到更好的性能,并发现使用数据的代码通常要干净和简单得多。

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

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

jhdbpxl9

jhdbpxl92#

原则上,同一示例上的Redis数据库与RDBMS数据库示例中的模式没有什么不同。
那么,为什么/什么时候我会想要使用多个Redis数据库,而不是仅仅为我想要的每个额外的数据库创建一个额外的Redis示例?

在同一个redis示例中使用redis数据库有一个明显的优势,那就是管理。如果您为每个应用程序启动一个单独的示例,假设您有3个应用程序,那么就是3个独立的Redis示例,每个示例在生产中都可能需要一个从示例来实现高可用性,所以总共有6个示例。从管理的Angular 来看,这很快就会变得杂乱无章,因为您需要监视所有这些示例、执行升级/补丁等。如果您不打算让具有高I/O的Redi超载,那么具有从示例的单个示例更简单、更容易管理,前提是它满足您的SLA。

p5fdfcr1

p5fdfcr13#

即使是萨尔瓦多·桑菲利波(Redis的创建者)也认为在Redis中使用多个数据库不是一个好主意。点击此处查看他的评论:

https://groups.google.com/d/topic/redis-db/vS5wX8X4Cjg/discussion
我明白这是如何有用的,但不幸的是,我认为Redis的多个数据库错误是我在Redis设计中最糟糕的决定。在没有任何实际收益的情况下,这会使内部结构变得复杂得多。现实情况是,数据库不能很好地扩展的原因有很多,比如密钥和VM的活动过期。如果可以使用字符串执行DB选择,我可以看到该功能被用作可伸缩的O(1)字典层,但事实并非如此。

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

c7rzv4ha

c7rzv4ha4#

1.我真的不知道在一个示例上拥有多个数据库有什么好处。我想,如果多个服务使用相同的数据库服务器,那么它会很有用,这样您就可以避免键冲突。
1.我不建议使用KEYS命令进行构建,因为它是O(N),而且伸缩性不好。你用它来做什么,你可以用另一种方式来完成?如果像KEYS这样的功能至关重要,也许redis不是最适合你的。
1.我想他们在他们的常见问题解答中提到了单线程服务器的好处,但主要的是简单-你不必以任何真正的方式费心并发性。每个操作都是阻塞的,因此没有两件事可以同时更改数据库。理想情况下,每个服务器的每个核心都有一个(或多个)示例,并使用一致的散列算法(或代理)在它们之间划分密钥。当然,您会失去一些功能--管道只适用于同一服务器上的内容,排序变得更加困难等等。

iqxoj9l9

iqxoj9l95#

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

dbf7pr2w

dbf7pr2w6#

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

ldxq2e6h

ldxq2e6h7#

我知道这个问题由来已久,但多个数据库可能有用还有另一个原因。

如果你使用你最喜欢的云提供商的“云Redis”,你可能有一个最小的内存大小,并且会为你分配的东西付费。然而,如果您的数据集小于该值,那么您将浪费一点分配,因此浪费一点钱。

使用数据库,您可以使用相同的Redis云示例来为(比方说)开发、UAT和生产提供服务,或者为您的应用程序的多个示例或其他任何东西提供服务,从而使用更多分配的内存,从而更具成本效益。

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

taor4pac

taor4pac8#

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

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

相关问题