缓存策略,输出缓存与数据缓存还是两者兼而有之?

时间:2009-02-17 22:04:20

标签: asp.net asp.net-mvc architecture caching outputcache

我正在开发一个ASP.NET MVC项目,我已经开始考虑我的缓存策略了。我试图让我的框架尽可能开放,以便用于缓存。

根据我在Scott Hanselman播客期间所听到的内容,StackOverflow.com使用页面输出缓存并将内容拉链并将其放入RAM中。听起来这对于用户范围的缓存来说非常有用,但对于像个性化页面这样的东西,您必须为每个用户缓存一个版本,并且可能会很快失控。

所以,对于缓存策略。哪个应该使用,输出缓存,数据缓存还是组合?我的第一个想法是两者,但就缓存依赖性而言,它听起来有点复杂。

2 个答案:

答案 0 :(得分:8)

我们正在大规模(每天访问300万次)网站(新闻门户网站)进行API和输出缓存。该网站主要由匿名用户使用,但我们确实有经过身份验证的用户,我们只为他们缓存一个完整的网站,因为该网站的一些个性化部分,我必须承认我们绝对没有内存压力问题。

因此,我的建议是在API缓存中缓存所有内容,以便更快地重建输出缓存。

当然,请密切注意性能计数器中的缓存比值。你应该看到数字> 95%的缓存命中。

要注意的另一件事是缓存失效,如果您有很多相关内容,这是一个大问题。例如,您可以缓存音乐内容,并且可以在几百页上显示和缓存有关一个专辑或歌曲的信息。如果该歌曲有任何变化,您必须使所有这些页面无效,这可能会有问题。

最重要的是,缓存是ASP.NET的最佳功能之一,它完美无缺,您可以依赖它。

答案 1 :(得分:7)

小心过度激进的缓存。虽然缓存是一种帮助提高性能的工具,但如果使用不当,实际上可能会使性能变差。

如果不了解有关项目的更多详细信息,我无法回答输出缓存或数据缓存是否会对您有所帮助。 我可以帮助提供几个何时使用另一个的例子。

如果您有一个特定的数据集,您可以在许多不同的视图中使用它,那么最好使用数据缓存。如果您的数据提取操作相对于数据呈现非常常见且昂贵,则可以使用此方法。如果您有多个使用相同数据的视图,则可以节省数据提取时间。

如果您有一个使用非常特定数据集的视图并且视图的呈现很复杂并且经常请求此视图(例如,堆栈溢出的主页),那么您将从输出缓存中受益匪浅。

所以最后,它实际上取决于您的需求,并且要小心使用缓存。