我有一个MVC4网站,我正在使用OutputCache来缓存显示多页排名结果的视图的结果。缓存的输出因Page参数而异。排名是时间的函数,因此任何给定页面的结果都可能不同步,具体取决于它们何时被缓存,而我使用无限滚动机制可以显示重复结果,从而加剧了这一点。如果结果被推送到下一页。
解决此问题的理想方法是一次性缓存一些合理数量的页面。这将需要能够检查缓存的输出是否已过期,如果它们过期则重新生成缓存的结果,然后返回缓存的响应。这可能吗?
我还应该注意,我正在使用OutputCaching与Azure输出缓存提供程序,我有一个专用的缓存角色(注意:不共享缓存服务)。
非常感谢任何帮助。
答案 0 :(得分:1)
这需要能够检查缓存的输出是否为 已过期,如果已过期则重新生成缓存结果 返回缓存的响应。这可能吗?
这正是OutputCaching的工作原理 - 请求页面,如果它存在于缓存中且未过期,则从缓存中检索它,否则,渲染页面并更新缓存。
如果数据确实是动态的,那么通过缓存输出可能会导致更多的工作/问题,而不会在性能上获得任何好处(KISS适用于此处!如果可以避免问题,请不要为问题创建解决方案第一名)。
但是,如您所描述的(如果确实需要)可以使用Azure队列和工作者角色来构建解决方案。添加/更新评级时,您的评级引擎会在队列中填入值。然后,让Worker Role每隔一秒(例如)轮询Queue以获取值。如果找到值,则具有Worker Role对缓存页面执行Web请求。如果输出缓存已过期,这将更新输出缓存。但是,您仍受限于缓存过期。除非你做的事情来自this SO post):
HttpResponse.RemoveOutputCacheItem()可能是您想要的方法 使用。如果您可以确定缓存操作的名称, 您可以只删除特定的操作(尝试设置断点或 将所有缓存项目的名称转储到屏幕上)