0

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

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

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

任何帮助将不胜感激。

4

1 回答 1

1

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

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

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

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

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

于 2013-03-13T01:29:19.767 回答