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

Posted

技术标签:

【中文标题】缓存策略,输出缓存与数据缓存还是两者兼而有之?【英文标题】:Caching strategy, Output Cache vs Data Cache or both? 【发布时间】:2010-10-08 05:15:25 【问题描述】:

我正在处理一个 ASP.NET MVC 项目,我已经到了要开始考虑我的缓存策略的地步。我试图让我的框架尽可能开放,以便在缓存中使用。

根据我在 Scott Hanselman 的播客中听到的消息,***.com 使用页面输出缓存并压缩该内容并将其放入 RAM。这听起来很适合用户范围的缓存,但对于个性化页面之类的内容,您必须为每个用户缓存一个版本,这可能很快就会失控。

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

【问题讨论】:

【参考方案1】:

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

所以,我的建议是尽可能在 API 缓存中缓存所有内容,这样您的输出缓存重建速度会更快。

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

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

归根结底,缓存是 ASP.NET 的最佳特性之一,它做得非常出色,您可以信赖它。

【讨论】:

您使用的是网络农场吗?如果是这样,每个 Web 服务器是否都有自己的独立于其他 Web 服务器的 inproc 缓存?【参考方案2】:

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

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

如果您有一个经常在许多不同视图中使用的特定数据集,则最好使用数据缓存。如果您的数据获取操作相对于您的数据呈现非常常见且成本高昂,您将使用它。如果您有多个使用相同数据的视图,则可以节省数据获取时间。

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

所以最后,这真的取决于你的需求,小心使用不正确的缓存。

【讨论】:

查看 Kigg (codeplex.com/Kigg) 以获取作为 digg 克隆的 ASP.NET MVC 应用程序的示例。如果您的应用程序与 digg 克隆完全一样,那么我将输出缓存故事页面和主页。根据您的数据结构的外观,可能需要缓存用户信息。

以上是关于缓存策略,输出缓存与数据缓存还是两者兼而有之?的主要内容,如果未能解决你的问题,请参考以下文章

如何保证Redis缓存与数据库的一致性?

Redis(1.8)Redis与mysql的数据库同步

Redis的缓存淘汰策略LRU与LFU

场景应用:如何保证缓存与数据库的双写一致性?

场景应用:如何保证缓存与数据库的双写一致性?

缓存策略