【问题标题】:How can I cache the data in Meteor?如何在 Meteor 中缓存数据?
【发布时间】:2017-04-19 03:34:59
【问题描述】:

谢谢大家! 最近我想在流星上建一个小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 ,而且我不知道如何通过套接字缓存.......我尝试了清漆,但没有看到任何效果。 那么,可能是它忽略了 websocket 吗?有什么方法可以缓存数据,在 mongodb 中,在服务器中,我可以添加一些缓存服务器吗?

2、聊天

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

【问题讨论】:

    标签: caching meteor


    【解决方案1】:

    使用 Meteor,您不必担心缓存 Mongodb 查询。 Meteor 会为您做到这一点。每the docs on data and security

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

    [...]

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

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

    如果您在 mongo 中有很多文档,如果您仍然启用了自动发布包,您可能还会看到它们都被获取。您可以通过使用 meteor remove autopublish 将其删除并编写代码以仅发布相关数据而不是整个数据库来解决此问题。

    如果您确实需要手动管理缓存,文档也有介绍:

    复杂的客户端可以打开和关闭订阅,以控制缓存中保留的数据量并管理网络流量。当订阅关闭时,它的所有文档都会从缓存中删除,除非另一个活动订阅也提供了相同的文档。

    目前正在对 Meteor 进行其他性能改进,包括支持“大量客户端”的 DDP 级代理。你可以在the Meteor roadmap看到更多细节。

    【讨论】:

    • 但是问题是,比如我有一个网站,人每次到首页,都必须从meteor服务器加载数据!但是如果你使用其他语言或框架,你可以使用 varnish 或 squid 来缓存主页,从缓存服务器加载数据。我的意思是,我可以在我的流星之前有一个 varnish 或 squid 或 nginx 来缓存一些东西,缓存服务器可以理解 Meteor 的 DDP(或 websocket) ?
    • 目前不可能,但它正在开发中,因此请在几个月后回来查看并密切关注 Meteor 路线图。
    • 嘿@Rahul - 我知道这是超出范围的问题,但与您的答案非常相关。如果我希望它是相反的,有没有办法,例如为某个页面设置 no-cache?提前致谢!
    • @Faron 好一个。您应该将此作为一个单独的问题提出!
    • @Rahul 谢谢,刚刚做到了。对于读者——如果你是这种情况,问题在stackoverflow.com/questions/29260643/…
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-12-11
        • 1970-01-01
        • 2011-04-12
        • 2019-12-03
        • 1970-01-01
        • 1970-01-01
        • 2019-12-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多