Answers:
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的性能将是灾难性的。它们应隔离在不同的节点上。
显然,差异远不止于此,但是对于非常高的概述:
对于用例:
技术上:
有一些重叠,但是同时使用两者是非常普遍的。原因如下:
Redis可以代替传统的数据存储,但是最常与另一个普通的“长”数据存储一起使用,例如Mongo,Postgresql,MySQL等。
Redis作为MongoDB的缓存服务器非常出色。这是发生了什么。
每当猫鼬发出高速缓存查询时,它将首先转到高速缓存服务器。
缓存服务器将检查以前是否曾经发出过该确切查询。
如果还没有,那么缓存服务器将接受查询,将其发送到mongodb,然后Mongo将执行查询。
然后,我们将获取该查询的结果,然后返回到缓存服务器,缓存服务器将查询结果存储在其自身上。
它将说,每当我执行该查询时,我都会得到该响应,因此它将在发出的查询与从这些查询返回的响应之间保持记录。
缓存服务器将获取响应并将其发送回mongoose,mongoose将其表达出来,最终最终在应用程序内部。
每当再次发出相同的确切查询时,mongoose都会将相同的查询发送到高速缓存服务器,但是如果高速缓存服务器在未将查询发送到mongodb之前看到此查询已发出,则它将接受响应查询最后一次得到,并立即将其发送回猫鼬。这里没有索引,没有全表扫描,什么都没有。
我们正在做一个简单的查询,说这个查询已经执行了吗?是?好的,接受请求并立即将其发送回去,不要将任何内容发送给mongo。
我们有猫鼬服务器,缓存服务器(Redis)和Mongodb。
在缓存服务器上,可能有一个数据存储,其数据类型为键值类型,其中所有键都是之前发出的某种查询,而值是该查询的结果。
因此,也许我们正在查找_id提供的大量博客文章。
因此,也许其中的键是我们之前查询过的记录的_id。
因此,让我们想象一下,猫鼬在尝试查找_id为123的博客文章时会发出一个新查询,该查询流入缓存服务器,缓存服务器将检查是否有任何正在寻找_id的查询的结果的123。
如果缓存服务器中不存在此查询,则会执行此查询并将其发送到mongodb实例。Mongodb将执行查询,获取响应并将其发送回。
该结果被发送回高速缓存服务器,后者获取该结果并立即将其发送回猫鼬,因此我们会尽快获得响应。
此后,高速缓存服务器还将获取发出的查询,并将其添加到已发出的查询集合中,并获取查询结果并将其存储到查询中。
因此,我们可以想象,将来我们会再次发出相同的查询,它会到达缓存服务器,查看它拥有的所有键,然后说哦,我已经发现博客文章,它并没有接触到mongo,它只需要花费查询的结果,并将其直接发送到猫鼬。
我们没有做复杂的查询逻辑,没有索引,没有类似的事情。它尽可能快。它是一个简单的键值查找。
以上就是缓存服务器(Redis)与MongoDB一起工作的概述。
现在还有其他问题。我们会永远缓存数据吗?我们如何更新记录?
我们不想总是将数据存储在缓存中并从缓存中读取数据。
缓存服务器不用于任何写操作。缓存层仅用于读取数据。如果我们曾经写过数据,写操作将始终移至mongodb实例,并且我们需要确保在每次写数据时,都清除存储在缓存服务器中与刚在Mongo中更新的记录相关的所有数据。