【问题标题】:Programmatically caching a bunch of pages all at the same time using the Output Cache使用输出缓存以编程方式同时缓存一堆页面
【发布时间】:2013-02-28 06:58:46
【问题描述】:

我有一个 MVC4 网站,我正在使用 OutputCache 来缓存显示多页排名结果的视图的结果。缓存的输出因 Page 参数而异。排名是时间的函数,因此任何给定页面的结果都可能不同步,具体取决于它们何时被缓存,而我正在使用可以显示重复结果的无限滚动机制这一事实加剧了这种情况如果结果被推送到下一页。

这个问题的理想解决方案是一次缓存一些合理数量的页面。这将需要能够检查缓存的输出是否过期,如果缓存的结果过期则重新生成缓存结果,然后返回缓存的响应。这可能吗?

我还应注意,我将 OutputCaching 与 Azure 输出缓存提供程序一起使用,并且我有一个专用的缓存角色(注意:不是共享缓存服务)。

任何帮助将不胜感激。

【问题讨论】:

    标签: asp.net-mvc caching azure outputcache


    【解决方案1】:

    这需要能够检查缓存的输出是否 过期,如果它们过期,则重新生成缓存结果,然后 返回缓存的响应。这可能吗?

    这正是 OutputCaching 的工作原理 - 请求页面,如果它存在于缓存中且未过期,则从缓存中检索它,否则,呈现页面并更新缓存。

    如果数据确实是动态的,您可能会通过缓存输出而导致更多工作/问题,而没有实现任何性能提升(KISS 适用于此!如果您可以避免问题,请不要为问题创建解决方案第一名)。

    但是,按照您的描述(如果确实需要)构建解决方案可以使用 Azure 队列和辅助角色来完成。添加/更新评分时,让您的评分引擎在队列中填充一个值。然后,让 Worker Role 每秒(例如)轮询 Queue 以获取值。如果找到值,则让 Worker Role 对缓存页面执行 Web 请求。如果它已过期,这将更新输出缓存。但是,您仍然受到缓存过期的限制。除非你从this SO post 做类似的事情):

    HttpResponse.RemoveOutputCacheItem() 可能是您想要的方法 使用。如果你能弄清楚动作被缓存在什么名字下, 您可以只删除特定操作(尝试设置断点或 将所有缓存项的名称转储到屏幕上)

    【讨论】:

    • 我意识到这就是 OutputCaching 的方式,但这一切都是在幕后完成的。就像我说的那样,为了翻阅 10 页的结果而没有重复的结果,所有 10 页都必须使用相同的结果集同时生成。
    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    相关资源
    最近更新 更多