关于c#:不同ASP.NET缓存选项的优缺点

Pros/Cons of different ASP.NET Caching Options

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

我来了:

  • 内存缓存

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

  • 使用静态成员变量:

    1
    private static Northwind.SuppliersDataTable suppliers = null;
  • 应用程序状态:

    1
     HttpContext.Current.Application["key"] ="Value"
  • 数据缓存:

    1
    2
    3
    4
    5
    6
    7
    8
    HttpRuntime.Cache.Insert(
      /* key */               "key",
      /* value */             "value",
      /* dependencies */       null,
      /* absoluteExpiration */ Cache.NoAbsoluteExpiration,
      /* slidingExpiration */  Cache.NoSlidingExpiration,
      /* priority */           CacheItemPriority.NotRemovable,
      /* onRemoveCallback */   null);

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

我以前的问题:在内存中缓存应用程序数据:MVC Web API


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

因此,简而言之,取决于您的需求,决定哪种缓存技术和哪些特性最适合您。

For example, Let us discuss some client side Caching techniques

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

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

但是,msdn清楚地说:这种方法的安全支持非常少。

因此,可以使用或不使用此功能,因为这里也存在安全考虑。

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

页面输出缓存缓存整个网页,仅当该网页的内容相当静态时才适用。如果页面的某些部分发生更改,则可以将静态部分包装为用户控件,并使用页面片段缓存来缓存用户控件。

And one last comment onApplicationHttpRuntime.cache比较:

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

  • 应用程序变量是Web应用程序所有用户之间的共享变量。
  • 应用程序变量的行为类似于静态变量,它们可以代替静态变量,因为静态变量在Web应用程序中是无状态的。
  • 应用程序变量中只应持久化共享值,一旦不使用这些值,就应显式删除它们。

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

有关ASP.NET中所有缓存技术的完整详细说明,请参阅此msdn文章,并对每种技术的特性进行讨论。

此外,这两个链接也是一个很好的来源,可以从以下内容开始:

  • 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/


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

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

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


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

你最后的选择应该是任何依赖于HttpContextHttpRuntime的东西,因为这将把你绑在特定的主机上。Web API应用程序应该独立于其主机进行构建。