所以,我来到一个地方,我想将我在redis中存储的数据分割成单独的数据库,因为我有时需要在一种特定类型的数据上使用keys命令,并希望将它分开以使其更快.
如果我分成多个数据库,一切仍然是单线程的,我仍然只能使用一个核心.如果我只是在同一个盒子上启动另一个Redis实例,我会使用额外的核心.最重要的是,我不能命名Redis数据库,或者给它们任何更多的逻辑标识符.所以,所有这些都说明了为什么/什么时候我想要使用多个Redis数据库,而不是仅为我想要的每个额外数据库启动一个额外的Redis实例?相关地,为什么Redis不会为我添加的每个额外数据库使用额外的核心?跨数据库进行单线程的优势是什么?
The*_*ill 86
您不希望在单个redis实例中使用多个数据库.它已弃用,如您所述,多个实例可让您利用多个核心.如果使用数据库选择,则必须在升级时进行重构.监视和管理多个实例既不困难也不痛苦.
实际上,通过基于实例的隔离,您可以在每个数据库上获得更好的指标.每个实例都有反映该数据段的统计数据,这可以实现更好的调整和更快速响应和准确的监控.使用最新版本并按实例分隔您的数据.
正如Jonaton所说,不要使用keys命令.如果您只是创建一个密钥索引,您会发现更好的性能.每次添加密钥时,都要将密钥名称添加到集合中.一旦放大,keys命令就不是非常有用,因为它需要很长时间才能返回.
让访问模式决定如何构建数据,而不是按照您认为的方式存储它,然后解决如何访问和稍后删除它.您将看到更好的性能,并且发现数据消耗代码通常更清晰,更简单.
关于单线程,请考虑redis是为速度和原子性而设计的.修改一个数据库中的数据的操作无需等待另一个数据库,但如果该操作保存到转储文件或处理从服务器上的事务怎么办?那时你开始进入并发编程的杂草.
通过使用多个实例,您可以将多线程复杂性转换为更简单的消息传递样式系统.
raf*_*ian 72
原则上,同一实例上的Redis数据库与RDBMS数据库实例中的模式没有什么不同.
所以,所有这些都说明了为什么/什么时候我想要使用多个Redis数据库,而不是仅为我想要的每个额外数据库启动一个额外的Redis实例?
在同一个redis实例中使用redis数据库有一个明显的优势,那就是管理.如果你为每个应用程序启动一个单独的实例,并且假设你有3个应用程序,那就是3个独立的redis实例,每个实例都可能需要一个生产中的HA从属设备,因此共有6个实例.从管理的角度来看,这很快就会变得凌乱,因为你需要监控所有这些,进行升级/补丁等.如果你不打算用高I/O重载redis,那么带有slave的单个实例就更简单了.只要符合您的SLA,便于管理.
Nir*_*mal 50
即使是Salvatore Sanfilippo(Redis的创建者)也认为在Redis中使用多个DB是个坏主意.在这里看到他的评论:
https://groups.google.com/d/topic/redis-db/vS5wX8X4Cjg/discussion
我理解这是如何有用的,但遗憾的是我认为Redis的多个数据库错误是我在Redis设计中最糟糕的决定......没有任何实际的好处,它会使内部组件变得更加复杂.实际情况是,数据库由于多种原因而无法很好地扩展,例如密钥和VM的活动过期.如果可以使用字符串执行数据库选择,我可以看到此功能被用作可扩展的O(1)字典层,而不是.
对于DB编号,默认为几个DB,我们更好地沟通了这个功能以及如何使用我认为.我希望在某些时候我们可以放弃多个DB支持,但我认为可能为时已晚,因为有很多人依赖这个功能来完成他们的工作.
Ral*_*ton 10
我知道这个问题已经有很多年了,但是多个数据库可能有用还有另一个原因。
如果您使用您最喜欢的云提供商提供的“云 Redis”,您可能有最小内存大小,并且需要为您分配的内存付费。然而,如果您的数据集小于该值,那么您将浪费一些分配,从而浪费一些钱。
使用数据库,您可以使用相同的 Redis 云实例来为(例如)开发、UAT 和生产、或应用程序的多个实例或其他任何服务提供服务 - 因此使用更多分配的内存,因此成本更高一些 -有效的。
我正在查看的用例有多个应用程序实例,每个实例使用 200-300K,但我的云提供商的最小分配量是 1M。我们可以将 10 个实例整合到一个 Redis 上,而不会真正削弱任何限制,从而节省大约 90% 的 Redis 托管成本。我知道这种方法存在局限性和问题,但认为值得一提。
我真的不知道在单个实例上拥有多个数据库有什么好处.我想如果多个服务使用相同的数据库服务器是有用的,那么您可以避免关键冲突.
我不建议使用KEYS命令构建,因为它是O(n)并且不能很好地扩展.你用什么方式可以用另一种方式完成?如果像这样的功能KEYS至关重要,也许redis不是最适合你的.
我认为他们在常见问题解答中提到了单线程服务器的好处,但主要是简单性 - 您不必以任何真实的方式打扰并发性.每个操作都是阻塞的,因此没有两件事可以同时改变数据库.理想情况下,每个服务器的每个核心都有一个(或多个)实例,并使用一致的散列算法(或代理)在它们之间划分密钥.当然,你会失去一些功能 - 管道只适用于同一台服务器上的东西,分类变得更难等.
| 归档时间: |
|
| 查看次数: |
62287 次 |
| 最近记录: |