带redis的MongoDB

任何人都可以举例说明当你将Redis和MongoDB相互结合使用时会受益吗?

tonyl7126 asked 2019-08-13T22:32:03Z
3个解决方案
155 votes

Redis和MongoDB可以一起使用,效果很好。 一个以运行MongoDB和Redis(以及MySQL和Sphinx)而闻名的公司是Craiglist。 请参阅Jeremy Zawodny的演讲。

MongoDB对于持久的,面向文档的,以各种方式索引的数据很有意义。 对于易失性数据或对延迟敏感的半持久性数据,Redis更有趣。

以下是在MongoDB之上具体使用Redis的几个示例。

  • 2.2之前的MongoDB还没有过期机制。 上限集合无法真正用于实现真正的TTL。 Redis具有基于TTL的过期机制,可以方便地存储易失性数据。 例如,用户会话通常存储在Redis中,而用户数据将在MongoDB中存储和索引。 请注意,MongoDB 2.2在集合级别引入了一个低精度的过期机制(例如用于清除数据)。

  • Redis提供了方便的set数据类型及其相关操作(并集,交集,多个集合上的差异等)。 在此功能的基础上实现基本的分面搜索或标记引擎非常容易,这是MongoDB更传统索引功能的一个有趣补充。

  • Redis支持在列表上有效阻止弹出操作。 这可用于实现ad-hoc分布式排队系统。 它比MongoDB tailable游标IMO更灵活,因为后端应用程序可以通过超时监听多个队列,以原子方式将项目转移到另一个队列等等......如果应用程序需要一些排队,那么将队列存储在Redis中是有意义的 ,并将持久性功能数据保留在MongoDB中。

  • Redis还提供pub / sub机制。 在分布式应用程序中,事件传播系统可能是有用的。 对于Redis来说,这也是一个很好的用例,而持久性数据保存在MongoDB中。

因为使用MongoDB设计数据模型比使用Redis(Redis更低级别)更容易,所以从MongoDB的主要持久数据灵活性和Redis提供的额外功能(低延迟)中受益是很有趣的。 ,项目到期,队列,发布/订阅,原子块等...)。 这确实是一个很好的组合。

请注意,永远不要在同一台机器上运行Redis和MongoDB服务器。 MongoDB内存设计为交换出来,而Redis则不是。 如果MongoDB触发了一些交换活动,Redis的性能将是灾难性的。 它们应该在不同的节点上隔离。

Didier Spezia answered 2019-08-13T22:33:18Z
23 votes

显然,存在的差异远远大于此,但对于非常高的概述:

对于用例:

  • Redis通常用作分布式计算的缓存层或共享白板。
  • MongoDB通常用作传统SQL数据库的交换替代品。

技术上:

  • Redis是一个具有磁盘持久性的内存数据库(整个数据库需要适合RAM)。
  • MongoDB是一个磁盘支持的数据库,只需要足够的RAM用于索引。

有一些重叠,但使用两者是非常常见的。 这就是为什么:

  • MongoDB可以更便宜地存储更多数据。
  • Redis对整个数据集来说更快。
  • MongoDB的文化是将所有文化存储起来,以后再找出访问模式"
  • Redis的文化是"仔细考虑您将如何访问数据,然后存储"
  • 两者都有依赖于它们的开源工具,其中许多工具一起使用。

Redis可以用作传统数据存储的替代品,但它最常用于另一个普通数据存储器。#long;#34; 数据存储,如Mongo,Postgresql,MySQL等。

Brian P O'Rourke answered 2019-08-13T22:35:15Z
0 votes

Redis与MongoDB一起作为缓存服务器非常出色。 这是发生了什么。

每当mongoose发出缓存查询时,它将首先转到缓存服务器。

缓存服务器将检查以前是否曾发出过该确切查询。

如果没有,则缓存服务器将接受查询,将其发送到mongodb,Mongo将执行查询。

然后我们将获取该查询的结果,然后返回缓存服务器,缓存服务器将查询结果存储在自身上。

它会说我随时执行该查询,我得到了这个响应,因此它将在发出的查询和从这些查询返回的响应之间保持记录。

缓存服务器将获取响应并将其发送回mongoose,mongoose将使其表达并最终在应用程序内部结束。

任何时候再次发出相同的确切查询,mongoose会将相同的查询发送到缓存服务器,但是如果缓存服务器发现此查询是在它不会将查询发送到mongodb之前发出的,那么它将采取响应 它最后一次获得的查询并立即将其发回给mongoose。 这里没有索引,没有全表扫描,没有。

我们正在做一个简单的查询,说这个查询已被执行了吗? 是? 好的,接受请求并立即发回,不要发送任何东西到mongo。

我们有mongoose服务器,缓存服务器(Redis)和Mongodb。

在缓存服务器上,可能存在具有键值类型的数据存储的数据存储,其中所有键都是之前发出的某种类型的查询,并且该值是该查询的结果。

所以也许我们正在通过_id查找一堆博文。

所以这里的键可能是我们之前查找过的记录的_id。

因此,让我们假设mongoose发出一个新的查询,它试图找到_id为123的博客帖子,查询流入缓存服务器,缓存服务器将检查它是否有查找_id的任何查询的结果 123。

如果缓存服务器中不存在此查询,则将其发送到mongodb实例。 Mongodb将执行查询,获得响应并将其发回。

此结果将被发送回缓存服务器,缓存服务器将获取该结果并立即将其发送回mongoose,以便尽可能快地获得响应。

在此之后,缓存服务器还将获取已发出的查询,并将其添加到已发出的查询集合中,并获取查询结果并将其存储在查询的正确位置。

所以我们可以想象,在未来我们再次发出相同的查询,它会点击缓存服务器,它会查看它拥有的所有密钥并说哦我已经找到了blogpost,它没有触及mongo,它只需要 查询的结果并将其直接发送到mongoose。

我们没有做复杂的查询逻辑,没有索引,没有这样的。 它尽可能快。 它是一个简单的键值查找。

这是一个关于缓存服务器(Redis)如何与MongoDB一起工作的概述。

现在还有其他问题。 我们是否永远缓存数据? 我们如何更新记录?

我们不希望始终将数据存储在缓存中并从缓存中读取数据。

缓存服务器不用于任何写入操作。 缓存层仅用于读取数据。 如果我们编写数据,写入将始终转移到mongodb实例,我们需要确保无论何时编写数据,我们都会清除缓存服务器上存储的与我们刚刚在Mongo中更新的记录相关的任何数据。

Daniel answered 2019-08-13T22:38:19Z
translate from https://stackoverflow.com:/questions/10696463/mongodb-with-redis