使用输出缓存以编程方式同时缓存一堆页面

时间:2013-03-12 16:25:45

标签: asp.net-mvc caching azure outputcache

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

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

我还应该注意,我正在使用OutputCaching与Azure输出缓存提供程序,我有一个专用的缓存角色(注意:共享缓存服务)。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

  

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

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

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

但是,如您所描述的(如果确实需要)可以使用Azure队列和工作者角色来构建解决方案。添加/更新评级时,您的评级引擎会在队列中填入值。然后,让Worker Role每隔一秒(例如)轮询Queue以获取值。如果找到值,则具有Worker Role对缓存页面执行Web请求。如果输出缓存已过期,这将更新输出缓存。但是,您仍受限于缓存过期。除非你做的事情来自this SO post):

  

HttpResponse.RemoveOutputCacheItem()可能是您想要的方法   使用。如果您可以确定缓存操作的名称,   您可以只删除特定的操作(尝试设置断点或   将所有缓存项目的名称转储到屏幕上)