如何在Meteor中缓存数据?

时间:2012-12-25 04:21:46

标签: caching meteor

谢谢大家! 最近我想在流星上建一个小cms,但有一些问题

1,缓存,页面缓存,数据缓存等。

例如,当人们搜索某篇文章时

在服务器端:

 Meteor.publist('articles',function(keyword){
   return Articles.find({keyword:keyword});
});

在客户端:

Meteor.subscribe('articles',keyword);

没关系,但...... 问题是,每次人们这样做,它都会调用mongo查询,并降低性能, 在其他框架中使用常见的http或https,人们可以依赖于像squid或varnish这样的东西来缓存页面或数据,所以每当你路由到url时,你都会从缓存服务器读取数据,但是meteor建立在socket.js或websocket上,我不知道如何通过套接字缓存.......我trid清漆,但看不到任何影响。 所以,可能是它忽略了websocket?是否有一些缓存数据的方法,在mongodb中,在服务器中,我可以添加一些缓存服务器吗?

2,聊天

我在https://github.com/zquestz/simplechat中看到聊天室示例 但与使用socket.js的implyment不同,此示例将聊天消息保存在mongodb中,因此数据流是消息 - > mongo-> query-> people,这也调用了mongo查询! 在socket.js中,只需将套接字保存在上下文(或服务器端缓存)中,这样数据就不会通过db。 我的问题是,Meteor中是否有套接字接口,所以我可以发信息 - > gt; socket->人物?如果不能,作为聊天室的例子,生产环境中的表现如何(我看它运行得很慢......)

3 个答案:

答案 0 :(得分:10)

使用Meteor,您不必担心缓存Mongodb查询。流星为你做到了。每the docs on data and security

  

每个Meteor客户端都包含一个内存数据库缓存。为了管理客户端缓存,服务器发布多组JSON文档,客户端订阅这些集合。随着集合中的文档发生变化,服务器会修补每个客户端的缓存。

     

[...]

     

订阅后,客户端将其缓存用作快速本地数据库,从而大大简化客户端代码。读取从不需要昂贵的往返服务器。它们仅限于缓存的内容:对客户端集合中每个文档的查询只会返回服务器发布到该客户端的文档。

因为Meteor经常轮询服务器以查看客户端的缓存是否需要修补,所以您可能偶尔会看到这些民意调查。但它们可能不是很大的要求。此外,由于Meteor的一项功能称为延迟补偿,当您更新数据源时,客户端会立即反映更改,而无需先等待服务器。这减少了用户降低性能的外观。

如果你在mongo中有很多文档,如果你仍然启用了autopublish包,你可能也会看到它们都被取出。您可以通过使用meteor remove autopublish删除它来修复它,并编写代码以仅发布相关数据而不是整个数据库。

如果您确实需要手动管理缓存,那么文档也会进入:

  

高级客户端可以打开和关闭订阅,以控制缓存中保留的数据量并管理网络流量。关闭订阅时,除非同一文档也由另一个有效订阅提供,否则将从缓存中删除其所有文档。

目前正在对Meteor进行额外的性能改进,包括支持“非常多的客户”的DDP级代理。您可以在the Meteor roadmap找到更多详细信息。

答案 1 :(得分:3)

如果你偶然发现这个问题不是因为对meteor的minimongo缺乏了解,而是对如何在暂时不需要它们之后缓存订阅感兴趣(但是他们可能在未来并且不想在客户端服务器上保留额外的DDP开销)有两个包选项:

https://github.com/ccorcos/meteor-subs-cache

https://github.com/kadirahq/subs-manager

答案 2 :(得分:0)

我正在创建移动应用程序并且数据库缓存无法正常工作因此我使用了流量https://github.com/raix/Meteor-GroundDB的GroundDB包,现在每当我重新启动应用程序时数据库总是在本地, 此外,您需要查看meteor的mecache包以在本地缓存整个应用程序。