缓存策略,输出缓存 vs 数据缓存还是两者都用?

8
我正在开发一个ASP.NET MVC项目,现在我要开始考虑缓存策略了。我尽量让我的框架尽可能开放以便于在缓存中使用。
据我听 Scott Hanselman 在他的播客 StackOverflow.com 中说,他们使用页面输出缓存,并将其压缩并放入内存中。这听起来对于用户范围的缓存来说非常好,但是对于个性化页面之类的东西,您必须为每个用户缓存一个版本,而这可能会很快失控。
因此,关于缓存策略,应该使用什么,输出缓存,数据缓存还是组合使用?我的第一个想法是两者都使用,但就缓存依赖性而言,它听起来可能会变得有点复杂。
2个回答

8
我们正在一个大规模的网站(新闻门户网站,每天有300万访问量)上进行API和输出缓存。该网站主要由匿名用户使用,但我们也有认证用户,并为他们缓存整个网站,因为网站中有一些个性化部分。我必须承认,我们在内存压力方面完全没有问题。
所以,我的建议是尽可能地缓存所有可以在API缓存中缓存的内容,这样你的输出缓存重建就会更快。
当然,要密切关注性能计数器中的缓存比率值。你应该看到超过95%的缓存命中率。
另一个需要注意的问题是缓存失效,如果你有很多相关内容,这将是一个大问题。例如,你缓存音乐内容,有关某个专辑或歌曲的信息可能会显示并缓存在几百个页面上。如果这首歌发生了任何变化,你必须使所有这些页面失效,这可能会带来问题。
总之,缓存是ASP.NET最好的功能之一,它做得非常出色,你可以依靠它。

4
你是否使用了Web Farm?如果是,每个Web服务器是否都有自己的独立inproc缓存,不受其他Web服务器的影响? - frankadelic

7
请小心过度缓存。尽管缓存是帮助性能的工具,但使用不当会使性能变差。
如果您没有更多有关项目的详细信息,我无法回答输出缓存或数据缓存哪个更适合您。我可以提供一些示例,说明何时使用其中一个。
如果您有一个特定的数据集,经常在许多不同的视图中使用,最好使用数据缓存。如果您的数据获取操作相对于数据渲染非常常见且昂贵,则应使用数据缓存。如果您有多个视图使用相同的数据,则可以节省数据获取时间。
如果您有一个视图使用非常特定的数据集,并且视图的呈现很复杂,并且该视图经常被请求(例如Stack Overflow的主页),那么您将从输出缓存中受益匪浅。
因此,最终取决于您的需求,请注意不要错误地使用缓存。

请查看Kigg(http://www.codeplex.com/Kigg)的示例,这是一个ASP.NET MVC应用程序,它是digg克隆版。如果您的应用程序与digg克隆版完全相同,则我会输出缓存故事页面和主页。根据数据结构的情况,可能需要缓存用户信息。 - ajma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接