不同 ASP.NET 缓存选项的优缺点

Posted

技术标签:

【中文标题】不同 ASP.NET 缓存选项的优缺点【英文标题】:Pros/Cons of different ASP.NET Caching Options 【发布时间】:2013-09-27 02:04:28 【问题描述】:

我最近问了一个关于在 ASP.NET MVC WebAPI 应用程序中缓存应用程序数据的问题,这让我想到了一个新问题。 ASP.NET 中可用的不同缓存方法的优缺点是什么?

我遇到了:

内存缓存

http://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache.aspx

使用静态成员变量:

private static Northwind.SuppliersDataTable suppliers = null;

应用状态:

 HttpContext.Current.Application["key"] ="Value"

数据缓存:

HttpRuntime.Cache.Insert(
  /* key */                "key", 
  /* value */              "value", 
  /* dependencies */       null, 
  /* absoluteExpiration */ Cache.NoAbsoluteExpiration, 
  /* slidingExpiration */  Cache.NoSlidingExpiration, 
  /* priority */           CacheItemPriority.NotRemovable, 
  /* onRemoveCallback */   null);

我确信还有其他人,而且我知道他们在技术上都将数据存储在内存中......所以知道我应该为 ASP.NET MVC webapi 使用什么吗?

我的上一个问题: Caching application data in memory: MVC Web API

【问题讨论】:

这取决于,你可以说你想做什么,但是,我不喜欢Application 条目。我更喜欢使用IDictionary<string, object>Cache 可以重新制作数据。 【参考方案1】:

每种缓存技术/方法都有自己的一组功能。这些功能在一种应用需求中似乎是不利的,但在其他应用需求中可能是有利的。

因此,简而言之,根据您的要求决定哪种缓存技术和哪些功能最适合您。

For example, Let us discuss some client side Caching techniques.

MSDN 表示,我们还可以使用 HiddenField 在隐藏字段中仅存储少量频繁更改的数据,因为这些数据包含在每次回发时到服务器的往返行程中。

此功能的优势:通过使用客户端选项存储页面信息来减少服务器的工作量。

但是,MSDN 明确表示:这种方法的安全支持最少。

因此,人们可能会或可能不会始终使用此功能,因为还存在安全考虑。

Consider one more examplePage Output caching:分为页面输出缓存和页面片段缓存两种。

页面输出缓存缓存整个网页,并且仅适用于该页面的内容相当静态的情况。如果页面的某些部分发生变化,您可以将静态部分包装为用户控件,并使用页面片段缓存来缓存用户控件。

And one last comment on Application vs HttpRuntime.cache

Application 不是缓存,它是一个全局命名值集合。如果您将对象添加到 Application,它将一直保留到 appdomain 回收为止。

应用程序变量是 Web 应用程序的所有用户之间的共享变量 应用程序变量的行为类似于静态变量,它们可以替代静态变量,因为静态变量在 Web 应用程序中是无状态的 只有共享值应该保留在应用程序变量中,一旦它们不被使用,就应该明确地删除它们。

Cache :通过在ApplicationCache 类中缓存频繁请求的对象和数据,可以显着提高ASP.NET 应用程序的性能。尽管Cache 类确实提供了更多的灵活性和控制力,但它似乎只提供了比Application 缓存类更高的吞吐量方面的边际优势。开发一个测试方案来准确测量Cache 类的潜在优势是非常困难的 - 通过清理过程管理较少使用的对象,而不是应用程序不提供此功能。开发人员需要在这种情况下做出决定,并应基于项目的需求和便利性及其使用模式。查看this link了解更多信息。

请参阅 this MSDN article 以获得关于 Asp.net 中所有缓存技术的完整解释,并讨论每种技术的特性。

另外,这 2 个链接是一个很好的起点:

http://weblogs.asp.net/pjohnson/httpruntime-cache-vs-httpcontext-current-cache http://devshop.wordpress.com/2008/04/10/how-to-choose-from-viewstate-sessionstate-cookies-and-cache/

【讨论】:

很棒的概述!虽然您的评论主要针对 asp.net 网站而不是 webapi,但您列出的 msdn 网络文章有很多令人惊叹的信息。 @Interstellar:链接通常会停止工作......我试图在我的回答中包含尽可能多的细节。但不希望它太长。 MSDN 链接和第一个链接工作正常,其中包含大部分有价值的信息。您还可以在 Peter Johnson 的博客上搜索此处的任何内容:weblogs.asp.net/pjohnson weblogs.asp.net/pjohnson/archive/2006/02/06/437559.aspx weblogs.asp.net/pjohnson/437559 未找到 P Johnson 修复链接:weblogs.asp.net/pjohnson/…【参考方案2】:

关于 MemoryCache 与 ASP.NET 缓存:它们提供了非常相似的功能。在 ASP.NET 4 应用程序中,我通常更喜欢 ASP.NET 缓存,如果没有其他原因,那是因为 a bug in .NET 4,这显然已在 .NET 4.5 中修复。

静态字段适合存储不需要过期策略的共享数据。

应用程序状态只不过是一个具有与经典 ASP 兼容的锁定语义的静态字典 - 我只会使用它来向后兼容传统的经典 ASP 代码。

【讨论】:

你知道这些缓存方法中的任何一个是否在 IIS 工作线程超时期间都是持久的吗? @vesuvious - 是的,它们都会在请求超时后持续存在:这样的超时对静态字段没有影响。当应用程序域被回收时,它们将被清除。【参考方案3】:

使用 Web API 时,您的首选缓存应该始终是在 HTTP 响应中设置缓存标头。 HttpResponseMessage.CacheControlHeader

您的最后一个选项应该是依赖于HttpContextHttpRuntime 的任何选项,因为这会将您绑定到特定主机。 Web API 应用程序应独立于其主机构建。

【讨论】:

你的意思是最后一个选项应该是? @user20358 我的意思是您应该先尝试使用与主机无关的优化,然后再尝试使用依赖于主机的机制进行优化。

以上是关于不同 ASP.NET 缓存选项的优缺点的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET WebForm的优缺点

asp.net mvc框架优缺点

asp,net 传值方式 优缺点比较

第二十八篇 asp.net性能优化之使用Redis缓存

SqlCE 作为 asp.net 下的数据库 - 有啥缺点?

一起使用 ASP.Net AJAX 和 JQuery 的任何缺点