97

任何人都可以举例说明您何时可以从结合使用 Redis 和 MongoDB 中受益?

4

3 回答 3

158

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

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

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

  • Pre-2.2 MongoDB 还没有过期机制。Capped collections 不能真正用于实现真正的 TTL。Redis 有基于 TTL 的过期机制,方便存储易失数据。例如,用户会话通常存储在 Redis 中,而用户数据将存储和索引在 MongoDB 中。请注意,MongoDB 2.2 在集合级别引入了低精度过期机制(例如,用于清除数据)。

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

  • Redis 支持对列表进行高效的阻塞弹出操作。这可以用来实现一个 ad-hoc 分布式排队系统。它比 MongoDB 可尾游标 IMO 更灵活,因为后端应用程序可以在超时时监听多个队列,以原子方式将项目传输到另一个队列等......如果应用程序需要一些排队,则将队列存储在 Redis 中是有意义的,并将持久化的功能数据保存在 MongoDB 中。

  • Redis 还提供了发布/订阅机制。在分布式应用程序中,事件传播系统可能很有用。这又是 Redis 的一个很好的用例,而持久性数据保存在 MongoDB 中。

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

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

于 2012-05-23T13:44:06.737 回答
25

显然有这更多的差异,但对于一个非常高的概述:

对于用例:

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

技术上:

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

有一些重叠,但两者都使用是非常常见的。原因如下:

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

Redis 可以用作传统数据存储的替代品,但它最常另一种普通的“长”数据存储一起使用,例如 Mongo、Postgresql、MySQL 等。

于 2013-11-14T02:14:03.193 回答
1

Redis 与 MongoDB 作为缓存服务器配合得非常好。这就是发生的事情。

每当猫鼬发出缓存查询时,它都会首先转到缓存服务器。

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

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

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

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

缓存服务器将接收响应并将其发送回 mongoose,mongoose 将其交给 express 并最终在应用程序中结束。

每当再次发出相同的确切查询时,mongoose 都会将相同的查询发送到缓存服务器,但是如果缓存服务器在将查询发送到 mongodb 之前发现该查询已发出,而是将响应发送到它最后一次得到的查询并立即将其发送回猫鼬。这里没有索引,没有全表扫描,什么都没有。

我们正在做一个简单的查询来说明这个查询是否被执行了?是的?好的,接受请求并立即将其发送回去,不要向 mongo 发送任何内容。

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

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

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

所以也许这里的键是我们之前查过的记录的_id。

所以让我们想象一下 mongoose 发出一个新查询,它试图找到一个 _id 为 123 的博客文章,查询流入缓存服务器,缓存服务器将检查它是否有任何正在寻找 _id 的查询的结果123 个。

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

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

在那之后,缓存服务器也将获取发出的查询,并将其添加到已发出的查询集合中,并获取查询的结果并将其存储在查询中。

所以我们可以想象,将来我们再次发出相同的查询,它会访问缓存服务器,它会查看它拥有的所有键,然后说哦,我已经找到了那篇博文,它没有联系到 mongo,它只需要查询结果并将其直接发送给 mongoose。

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

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

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

我们不想总是将数据存储在缓存中并从缓存中读取。

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

于 2019-02-22T07:03:09.143 回答