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

标签 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

最佳答案

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

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

例如,让我们讨论一些客户端缓存技术

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

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

但是,MSDN 明确指出:这种方法具有最少的安全支持。

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

再考虑一个例子Page Output caching:它是2种,页面输出缓存和页面片段缓存。

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

关于 ApplicationHttpRuntime.cache 的最后一条评论:

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

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

Cache :通过在 ApplicationCache类。虽然 Cache 类确实提供了更多的灵 active 和控制,但它在增加吞吐量方面似乎仅比用于缓存的 Application 类提供了边际优势。很难开发一种测试方案来准确衡量 Cache 类内置的潜在优势 - 通过清理过程对较少使用的对象进行管理,而不是应用程序不这样做的事实提供此功能。开发人员需要在这种情况下做出决定,并且应该基于项目的需求和便利性及其使用模式。检查 this link 了解更多。

引用 this MSDN article 获取有关 Asp.net 中所有缓存技术的完整精彩解释,并讨论了每种技术的特性。

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

关于c# - 不同 ASP.NET 缓存选项的优缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18937855/

相关文章:

c# - 安装 log4net 多个项目

c# - 为什么这个 for 迭代变量在 for 循环之后仍然存在?

c# - 存储过程的 LINQ to SQL 自动生成类型

c# - ASP.Net - 在 SiteMapPath 中链接网站

javascript - 您可以使用 JavaScript 检测服务器端创建的文件下载窗口吗?

c# - 来自非 Controller 类的 ActionResult

c# - Windbg 和查看 AppDomain 内容

c# - 如何解析不同类型服务的 IEnumerable

javascript - Ajax 请求 asp.net mvc Controller 返回 500 - 内部服务器错误

asp.net - 允许 ApiController 上的匿名应用程序