Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
消息服务:redis还是mongodb?_Mongodb_Redis - Fatal编程技术网

消息服务:redis还是mongodb?

消息服务:redis还是mongodb?,mongodb,redis,Mongodb,Redis,我正在开发一个比简单地发送和接收消息更先进的消息系统;它看起来像facebook聊天/信息:它有聊天功能,但也有信息功能,如群信息、读/未读信息和其他功能 在redis上,我只需使用列表来存储收到的消息,例如: myID = [ "amy|how are you?", "frank|long time no see!" ] amyID = [ "john|I'm good! you?" ] (为了便于阅读,我把它简化了很多 但这样我就无法跟踪单个对话,因为一旦收到消息,它们都会被刷新(因此基本

我正在开发一个比简单地发送和接收消息更先进的消息系统;它看起来像facebook聊天/信息:它有聊天功能,但也有信息功能,如群信息、读/未读信息和其他功能

在redis上,我只需使用列表来存储收到的消息,例如:

myID = [ "amy|how are you?", "frank|long time no see!" ]
amyID = [ "john|I'm good! you?" ]
(为了便于阅读,我把它简化了很多

但这样我就无法跟踪单个对话,因为一旦收到消息,它们都会被刷新(因此基本上没有“收件箱”功能)

另一方面,如果我使用mongodb,我可以使用如下内容:

我想到了以下好处/缺点:

蒙哥达

优点:

  • 可以查看收件箱视图
  • 可以检查每个对话中的已读/未读消息
缺点

  • 没有redis那么快
  • 存储空间大大增加
雷迪斯

优点:

  • 易于接收新消息
  • 无存储问题(刷新消息)
缺点:

  • 发送到客户端的消息一旦丢失,就不会有读/未读功能和
  • 没有收件箱
有什么想法吗


提前感谢。

我认为这里的重点是存储问题。要使用MongoDB,您需要大量的机器或一个良好的会话刷新系统。尽管您需要一种“收件箱”系统…我认为redis更有利于一个运行良好的聊天系统-你只需要想出一些非常有创意的解决方案…或者放弃设计目标。

我不能回答redis的问题,因为我不使用它,也从来没有使用过,所以我不会假装我有

然而,如果出于某种原因,您没有像Facebook那样使用XMPP客户端:(又名Jabber)进行聊天,那么我将介绍这种情况下的纯MongoDB解决方案

MongoDB使用操作系统的LRU作为缓存文档和查询的手段,公平地说,它不提供直接查询缓存,但是如果您很聪明,您将不需要直接查询缓存;相反,您只需要直接从RAM读取所有查询。考虑到这一点,MongoDB可以和Redis一样快,因为Redis也使用计算机RAM

我认为,在优化的查询中,两者之间的速度可以忽略不计。真正衡量速度的标准来自您的模式、索引、集群设置和执行的查询

这里有一个关于存储大小的说明,请考虑您的意见:


刷新mongodb的问题比我最初认为的要大:显然,当你在mongo上删除某个东西时,你只会删除它的引用,所以如果你删除4mb的文档,它就不会释放那么多空间。真正释放内存的唯一方法是运行dbRepair(或者这行中的某个东西)这基本上会在运行时阻塞db

您似乎对MongoDB的工作方式有一些误解

此链接将对您有所帮助:它将描述使用过多磁盘空间的一些原因,还将解释您对计算机如何工作以及MongoDB如何释放和重用空间的一些误解

MongoDB不会在记录级别释放空间。相反,它会发送“空”记录(记录和文档是两件不同的事情,正如演示文稿所告诉您的),将其放入已删除的存储桶列表中,然后在出现新文档(或已移动的更新文档)并放入该空间时重新使用该空间

诚然,如果您不仔细了解MongoDB在这一级别上的工作方式,您可能会被迫相当定期地运行
repairDB
,以保持碎片化后的任何性能

至于内存处理。正如我所说,操作系统会处理这个问题。关于操作系统何时释放内存的一个很好的解释在维基百科上:

在没有足够的RAM来存储所需的所有数据之前,获取空页框的过程并不涉及从RAM中删除另一页

因此,操作系统将为您处理删除页面的问题,您不应该关心这一部分,相反,您应该关心使您的工作集适合RAM

如果您担心存储消息,但实际上并不想这样做,也就是说,您希望消息被“刷新”,那么实际上可以使用后来MongoDB安装时附带的TTL功能:这基本上允许您设置从集合中删除消息的超时时间

因此,就个人而言,如果设置正确的MongoDB可以像Facebook那样发送消息和聊天,他们当然会使用XMPP协议,然后将消息归档到Cassandra中进行搜索,但你不必像他们那样做,这只是实现相同目标的一种方法


希望这是有意义的,我没有兜圈子,这是一个有点长的答案。

我们使用混合设计,所以当我们需要在Redis上的消息、队列和缓存中获得快速性能时,以及当我们需要搜索二级索引或更新整个文档时,我们使用MongoDB


您也可以尝试Riak,它可以比MongoDB更线性、更平滑地增长。

刷新MongoDB的问题比我最初认为的要大:显然,当您在mongo上删除某些内容时,您只会删除其引用,因此如果您删除4mb的文档,它将不会释放那么多空间。真正释放内存的唯一方法是o运行dbRepair(或该行中的其他内容)这基本上会在运行时阻塞db…另一方面,我无法跟踪redis上已经读取的消息,因为它在内存上运行时,不应该无限期地增长,而是有一个可预见的周期size@johnsmith正确-您必须就什么更重要做出设计决策,或者定制一个既能满足需求又能满足需求的解决方案对您独特系统的要求。@johnsmith操作系统决定何时“释放备忘录”