我试图了解mongo的内部缓存是如何工作的,以及它是否确实消除了使用memcache。我们的数据库大小约为200G,索引适合内存但在索引后服务器上剩余的可用内存不多。
我的一位同事说mongo的内部缓存与memcache一样快,所以不需要使用memcache来引入另一个复杂程度。
我头脑中的场景是当我们从db读取数据时,它保存在memcache中,下次直接从缓存中读取而不是返回到db服务器。如果数据已更改且需要保存/更新,则会在memcache服务器和数据库服务器上完成。
我一直在读这个但是还不能说服自己。所以,如果有人能够对此有所了解,我真的很感激。
答案 0 :(得分:1)
首先,缓存存储与数据库不同。因此,与Memcache相比,MongoDB和SQL在目的和用途上有所不同。
Memcache非常擅长降低查询的工作集大小。例如:想象一个带有子选择和CASE
语句的大型聚合查询以及SQL中没有的内容(想想最复杂的查询),一直实时执行此查询可能会导致计算机“捶打“(更不用说客户方面的问题)。
然而,众所周知,您只需要将此查询汇总到另一个集合/表,以便立即更快。 memcache的真正速度来自于它是内存键值存储的事实。这是MongoDB速度失败的地方,因为它不是内存存储,它是内存映射但不存储。
MongoDB没有自我缓存,只要查询“热”并且在LRU中(这是您的工作集进入的地方),您不应该注意到响应时间的差异。确保查询“热”的一个好方法是运行它。有些人有一个他们运行的最大查询的脚本来预热缓存。
正如我所说,memcache是一个缓存层,这就是原因:
如果数据已更改且需要保存/更新,则会在memcache服务器和数据库服务器上完成。
让我内心死一点。许多人会模糊数据库和缓存层之间的界限。