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

时间:2013-09-21 21:32:42

标签: c# asp.net asp.net-mvc caching asp.net-web-api

我最近问过一个关于在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

3 个答案:

答案 0 :(得分:34)

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

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

<强> For example, Let us discuss some client side Caching techniques

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

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

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

因此,有人可能会也可能不会使用此功能,因为安全考虑也在那里。

Consider one more example Page Output caching :它有两种类型,页面输出缓存和页面片段缓存。

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

And one last comment on Application vs HttpRuntime.cache

Application不是缓存,它是全局命名值集合。如果您将对象添加到Application,它将保留到应用程序域回收。

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

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

请参阅 this MSDN article ,详细了解Asp.net中的所有缓存技术,并讨论每种技术的功能。

此外,这两个链接是一个很好的起源:

答案 1 :(得分:9)

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

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

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

答案 2 :(得分:4)

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

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