Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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
了解MongoDB缓存系统_Mongodb - Fatal编程技术网

了解MongoDB缓存系统

了解MongoDB缓存系统,mongodb,Mongodb,这是一个基本的问题,但非常重要,我不确定是否能真正理解这一点 在官方文件上我们可以阅读 MongoDB将所有最近使用的数据保存在RAM中。如果您已经为查询创建了索引,并且工作数据集适合RAM,那么MongoDB将从内存中提供所有查询 我不太明白的部分是 如果您已经为查询创建了索引,并且您的工作数据集适合RAM 这里的“索引”是什么意思 例如,如果我更新了一个模型,然后我查询它,因为我已经更新了它,它现在在RAM中,所以它将来自内存,但这在我的脑海中不是很清楚 我们如何确定我们查询的数据是否来自内

这是一个基本的问题,但非常重要,我不确定是否能真正理解这一点

在官方文件上我们可以阅读

MongoDB将所有最近使用的数据保存在RAM中。如果您已经为查询创建了索引,并且工作数据集适合RAM,那么MongoDB将从内存中提供所有查询

我不太明白的部分是

如果您已经为查询创建了索引,并且您的工作数据集适合RAM

这里的“索引”是什么意思

例如,如果我更新了一个模型,然后我查询它,因为我已经更新了它,它现在在RAM中,所以它将来自内存,但这在我的脑海中不是很清楚

我们如何确定我们查询的数据是否来自内存?我知道MongoDB使用空闲内存来缓存关于当前空闲内存的数据,但是有人可以进一步解释全局行为吗

在哪种情况下,在存储数据的节点服务器中使用变量会比信任MongoDB缓存系统更好


您建议如何在全球范围内使用MongoDB实现巨大的流量?

MongoDB试图将整个集合保存在内存中:it内存映射每个集合页面。对于内存中的所有内容,数据页和引用它们的索引都必须保存在内存中

如果MongoDB返回一条记录,您可以放心它现在在内存中(无论它是否在查询之前)

MongoDB不像web浏览器那样保存记录的“缓存”。提交更改时,内存和磁盘都会更新


当与适当的用例相匹配时,Mongo非常棒。如果您有足够的服务器内存来缓存所有内容,并在超过该点后迅速下降,那么它的性能将非常高。很多很多高容量的网站都使用MongoDB:现在内存这么便宜是件好事。

注意:这是在2013年MongoDB还很年轻的时候写的,它没有今天的功能,虽然这个答案对于mmap仍然适用,但对于MongoDB现在实现的其他存储技术却没有,例如WiredTiger或Percona


一个很好的开始理解什么是索引的地方:

在你复习完这些之后,你会发现他们为什么这么好,然后跳到一些更复杂的问题上来

我们如何确定我们查询的数据是否来自内存

一种方法是查看任何查询
explain()
上的
yields
字段。这将告诉您读卡器由于数据不在RAM中而产生锁的次数

另一个更深入的方法是看类似和其他类似的节目。这些程序将告诉您
mongod
上发生了哪些页面错误(当数据需要从磁盘分页到RAM中时)

我知道MongoDB使用空闲内存来缓存关于当前空闲内存的数据,但是有人可以进一步解释全局行为吗

这其实是不正确的。说MongoDB做到了这一点比较容易,但实际上它没有做到。实际上,是操作系统和它自己的分页算法(通常是)为MongoDB实现了这一点。MongoDB会在一定时间内缓存索引计划,这样就不必不断地检查和测试索引

在哪种情况下,在存储数据的节点服务器中使用变量会比信任MongoDB缓存系统更好

我不知道你期望它如何工作……我的意思是,这两种方法做的事情完全不同,如果你打算在启动时将MongoDB中的数据读取到应用程序中,并将其写入var中,那么我绝对不推荐这样做

此外,用于内存管理的操作系统算法非常成熟和快速,所以它是可以的

您建议如何在全球范围内使用MongoDB来获得巨大的流量

嗯,这是个大问题。实际上,我建议您在这个主题上使用谷歌搜索一下,但正如文档中所述,您需要确保您的工作集适合RAM


这里有一个很好的起点:

“it内存映射每个集合页”它将内容映射到虚拟内存而不是RAM,它们是两个不同的东西,这是人们经常犯的错误,MongoDB不是内存中的数据库@Sammaye嗯,它映射到内存地址,不管它们是虚拟的还是物理的。当引用核心外地址时,会发生页面错误,然后将该磁盘页面移动到物理内存中。MongoDB将占用服务器几乎所有的物理内存(只为操作系统本身和其他进程保留一点点)。为了让MongoDB发挥性能,可用的物理内存应该超过数据库大小。因为操作系统允许,它会占用内存。然而,它只会将工作集加载到RAM中,如果您的工作集很小,那么MongoDB实际上会使用很少的量,比您的数据大小小得多。与@Sammaye-Curt一致,物理内存没有必要超过数据库大小(与大多数数据库一样)。正如Sammaye提到的,它的大小应该适合工作集。我假设这是针对旧的、不推荐使用的MMAPv1存储引擎,而不是当前默认的WiredTiger(它似乎有一个特定的缓存)?(因为它是从2013年开始的)我认为在关于缓存的讨论中,至少必须提到
WiredTiger
Percona
内存引擎…@PhilippeFanaro这是MongoDB之前很久的事了……很好的观点。但也许你可以编辑一个关于它的注释作为更新?这是一个经常访问的答案…@PhilippeFanaro fair,但如果经常访问,更好的解决方案是编辑这个答案,或者让有更多时间的人来写