Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';多个Redis数据库的意义何在?_Redis - Fatal编程技术网

什么';多个Redis数据库的意义何在?

什么';多个Redis数据库的意义何在?,redis,Redis,因此,我来到了一个地方,我想将我存储在redis中的数据分割成不同的数据库,因为有时我需要对一种特定的数据使用keys命令,并希望将其分离以加快速度 如果我分割成多个数据库,所有的东西仍然是单线程的,我仍然只能使用一个核心。如果我只是在同一个盒子上启动另一个Redis实例,我就可以使用一个额外的内核。除此之外,我无法命名Redis数据库,也无法为它们提供更具逻辑性的标识符。那么,既然如此,为什么/什么时候我会想使用多个Redis数据库,而不是为每个我想要的额外数据库创建一个额外的Redis实例呢

因此,我来到了一个地方,我想将我存储在redis中的数据分割成不同的数据库,因为有时我需要对一种特定的数据使用keys命令,并希望将其分离以加快速度

如果我分割成多个数据库,所有的东西仍然是单线程的,我仍然只能使用一个核心。如果我只是在同一个盒子上启动另一个Redis实例,我就可以使用一个额外的内核。除此之外,我无法命名Redis数据库,也无法为它们提供更具逻辑性的标识符。那么,既然如此,为什么/什么时候我会想使用多个Redis数据库,而不是为每个我想要的额外数据库创建一个额外的Redis实例呢?与此相关的是,为什么Redis不尝试为我添加的每个额外数据库使用一个额外的核心呢?跨数据库使用单线程有什么好处

  • 我真的不知道在一个实例上拥有多个数据库有什么好处。我想,如果多个服务使用同一个数据库服务器,这会很有用,这样可以避免密钥冲突

  • 我不建议使用
    KEYS
    命令进行构建,因为它是O(n),并且不能很好地扩展。你用它做什么,你可以用另一种方式完成?如果像
    键这样的功能非常重要,那么redis可能不是最适合您的

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


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

    那么,既然如此,为什么/什么时候我会想使用多个 Redis数据库,而不仅仅是旋转一个额外的Redis实例 对于每个我想要的额外数据库


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

    你不想在一个redis实例中使用多个数据库。正如您所指出的,多个实例允许您利用多个核心。如果使用数据库选择,升级时必须重构。监视和管理多个实例既不困难也不痛苦

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

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

    让访问模式决定如何构造数据,而不是按照您认为有效的方式存储数据,然后再围绕如何访问和切碎数据展开工作。您将看到更好的性能,并发现使用数据的代码通常更干净、更简单

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


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

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

    在部署新版本应用程序的罕见情况下,可以使用Redis数据库,因为新版本需要与不同的实体协作。

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

    我理解这是怎么有用的,但不幸的是我认为 Redis多个数据库错误是Redis设计中最糟糕的决定 全部的如果没有任何实际的收益,它会让内部变得很多 更复杂。现实情况是,数据库不能很好地扩展到一个特定的领域 原因的数量,如密钥和虚拟机的活动过期。如果DB 可以使用字符串执行选择。我可以看到此功能正在使用 用作可伸缩的O(1)字典层,但实际上并非如此

    使用DB编号,默认为几个DB,我们可以进行通信 我认为这个功能是什么以及如何使用更好。我希望 在某个时候,我们完全可以放弃对多个DBs的支持,但我认为 这可能太晚了,因为有许多人依赖于此 他们的工作特点


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

    同一数据库的不同副本可用于使用实时数据的生产、开发或测试。人们可以使用复制品