使用Redis的MongoDB


Answers:


158

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

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

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

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

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

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

  • Redis还提供了发布/订阅机制。在分布式应用程序中,事件传播系统可能会有用。对于持久性数据保留在MongoDB中而言,这也是Redis的绝佳用例。

由于使用MongoDB设计数据模型要比使用Redis容易得多(Redis更底层),因此可以从MongoDB的主要持久性数据灵活性和Redis提供的额外功能(低延迟)中受益。 ,商品过期,队列,发布/订阅,原子块等)。这确实是一个很好的组合。

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


19
MongoDB 2.2(刚刚发布)增加了TTL支持,解决了您的第一点:docs.mongodb.org/manual/tutorial/expire-data
John Zwinck

关于每种比较优势的要点。
Brian Bulkowski

2
关于每种比较优势的要点。Redis的要点之一是在内存中进行调整。还有其他专注于低延迟的项目,例如AerospikeDB,它专注于集群和可靠性,还专注于SSD存储,当实时用例超出了Redis可以轻松处理的范围时,可以使用它们。
Brian Bulkowski

杰里米·扎沃德尼(Jeremy Zawodny)演讲的视频本身:youtube.com/watch?
Frankenmint

25

显然,差异不止于此,但是对于非常高的概述:

对于用例:

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

技术上:

  • Redis是具有磁盘持久性的内存数据库(整个数据库需要容纳在RAM中)。
  • MongoDB是磁盘支持的数据库,仅需要足够的RAM来存储索引。

有一些重叠,但是同时使用两者是非常普遍的。原因如下:

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

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


0

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

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

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

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

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

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

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

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

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

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

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

因此,也许我们正在查找_id提供的大量博客文章。

因此,也许其中的键是我们之前查询过的记录的_id。

因此,让我们想象一下,猫鼬在尝试查找_id为123的博客文章时会发出一个新查询,该查询流入缓存服务器,缓存服务器将检查是否有任何正在寻找_id的查询的结果的123。

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

该结果被发送回高速缓存服务器,后者获取该结果并立即将其发送回猫鼬,因此我们会尽快获得响应。

此后,高速缓存服务器还将获取发出的查询,并将其添加到已发出的查询集合中,并获取查询结果并将其存储到查询中。

因此,我们可以想象,将来我们会再次发出相同的查询,它会到达缓存服务器,查看它拥有的所有键,然后说哦,我已经发现博客文章,它并没有接触到mongo,它只需要花费查询的结果,并将其直接发送到猫鼬。

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

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

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

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

缓存服务器不用于任何写操作。缓存层仅用于读取数据。如果我们曾经写过数据,写操作将始终移至mongodb实例,并且我们需要确保在每次写数据时,都清除存储在缓存服务器中与刚在Mongo中更新的记录相关的所有数据。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.