【问题标题】:Is meteor keeping cache for each "publish"流星是否为每个“发布”保留缓存
【发布时间】:2015-10-31 19:58:18
【问题描述】:

我正在使用 Iron Router(带有 RouteControllers),我想知道当页面(url)更改时,meteor 是否为“发布”保留缓存。

示例: 我想将流星用于烹饪网站,所以我有一个包含大量食谱的部分,我可以过滤这个列表(按主题、准备时间等)。因此,可能会有很多不同的列表。

(这是一个用例,但我的问题对于经典模式可能有效:用户访问食谱详细信息页面,然后离开...meteor 是否清理服务器上此订阅的缓存(发布了食谱数据)? )

如果我使用订阅,当我更改过滤器信息时,meteor 是否会保留缓存?如果没有,如何在不为每个请求使用的本地用户数据库(和服务器)上保留缓存的情况下做到这一点?

对不起,我是流星的初学者,对我来说有点困惑。当我阅读有关流星和发布/订阅的文档时,我认为我的应用使用会过度增加内存...

【问题讨论】:

    标签: node.js caching meteor iron-router publish-subscribe


    【解决方案1】:

    有多种情况需要考虑:

    1. 用户关闭页面并重新打开,或刷新。
      在这种情况下,本机不会保留任何订阅。

    2. 用户使用路由器更改页面(不重新加载或页面关闭),模板被销毁

      • 如果发布是在路由器控件内完成的,通常会在页面更改时取消(不保留)。我认为这对iron:routermeteorhacks:flow-router 都有效。
      • 如果发布完成inside the template control,则会在销毁时取消。
      • 否则,如果在这些预定义控件之外完成,则不会取消订阅。

    您需要适应这些行为。例如,如果您想记住跨路由器页面的订阅,则需要将它们存储在外部并以您自己的方式控制它们。

    【讨论】:

    • 哦,是的,所以如果这是典型的流程,这是一个非常好的消息!缓存是在我们加载模板(路由)时创建的,而当我们销毁模板时(例如在 Iron 路由器中路由更改时),它就很清楚了。
    • “取消”是什么意思?在我使用 Iron:router 构建的应用程序中,当我从一条路线导航到另一条路线时,来自上一条路线的数据仍然存在于集合中。只有当我明确停止订阅才是实际卸载的数据。
    • 啊,所以 Meteor 保留所有已发布的数据,无处不在,没有时间或使用限制?怎么用才不会过度增加内存?
    • 你避免发布和订阅太多=p。事实上,如果您的服务器运行“这里,获取这十亿个文档”,客户端将一直依赖它,直到它崩溃。
    【解决方案2】:

    afaik 缓存是客户端的,在 minimongo 中。在您在客户端订阅它之前,服务器上的发布实际上并没有被使用。即:

    Meteor.publish('allRecipes',function(){
      return Recipes.find();
    });
    

    自己不做任何事情。客户端订阅需要引用它。

    如果您的食谱集合非常大,并且您不希望有很多网络开销将其全部转移到客户端,那么您可以在订阅中实现服务器端搜索,例如使用https://atmospherejs.com/meteorhacks/search-source

    【讨论】:

    • 好的,谢谢,我了解缓存仅在客户端(用户)订阅时创建。但我的问题是关于何时删除此缓存,我认为@Kyll 回答了它。
    猜你喜欢
    • 2012-05-11
    • 2014-09-24
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    相关资源
    最近更新 更多