首页 文章

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

提问于
浏览
111

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

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

6 回答

  • 2

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

  • 59

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

  • 2

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

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

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

  • 42

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

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

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

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

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

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

  • 6

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

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

    我理解这是如何有用的,但遗憾的是我认为Redis多数据库错误是我在Redis设计中最糟糕的决定......没有任何实际收益,它会使内部组件变得更加复杂 . 实际情况是,数据库由于多种原因而无法很好地扩展,例如密钥和VM的活动过期 . 如果可以使用字符串执行数据库选择,我可以看到此功能被用作可扩展的O(1)字典层,而不是 . 对于DB编号,默认为几个DB,我们更好地沟通了这个功能以及如何使用我认为 . 我希望在某些时候我们可以放弃多个DB支持,但我认为可能为时已晚,因为有很多人依赖这个功能来完成他们的工作 .

  • 80
    • 我真的不知道在单个实例上拥有多个数据库有什么好处 . 我想如果多个服务使用相同的数据库服务器是有用的,那么你可以避免使用密钥碰撞 .

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

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

相关问题