56

我最近问了一个关于在 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 使用什么吗?

我的上一个问题: 在内存中缓存应用程序数据:MVC Web API

4

3 回答 3

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 ApplicationHttpRuntime.cache

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

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

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

有关 Asp.net 中所有缓存技术的完整解释,请参阅此 MSDN 文章,并讨论每种技术的特性。

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

于 2013-09-22T04:09:21.387 回答
10

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

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

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

于 2013-09-22T12:37:09.580 回答
4

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

您的最后一个选项应该是任何取决于HttpContextor的选项HttpRuntime,因为这会将您与特定的主机联系起来。Web API 应用程序应独立于其主机构建。

于 2013-09-22T12:27:12.177 回答