我最近问了一个关于在 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
每种缓存技术/方法都有自己的一组功能。这些功能在某个应用程序要求中似乎是不利的,但在其他应用程序要求中可能是有利的。
因此,简而言之,根据您的要求确定哪种缓存技术和哪些功能最适合您。
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 应用程序中是无状态 的
- 只有共享值应保留在应用程序变量中,一旦不使用它们,就应显式删除它们。
Cache
:通过在 Application
或 Cache
类中缓存频繁请求的对象和数据,可以在 ASP.NET 应用程序中获得显著的性能改进。虽然 Cache
类确实提供了更大的灵活性和控制力,但它似乎只在增加缓存Application
类的吞吐量方面提供了边际优势。开发一个测试方案是非常困难的,可以准确地衡量Cache
类内置的潜在优势 - 通过清理过程管理较少使用的对象,而不是应用程序不提供此功能的事实。 在这种情况下,开发人员需要做出决定,并且应基于项目的需求和便利性及其使用模式。查看此链接了解更多信息。
请参阅此 MSDN 文章,了解有关 Asp.net 中所有缓存技术的完整精彩说明,并讨论每种技术的功能。
此外,这两个链接是一个很好的来源:
- 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 中的一个错误,该错误显然已在 .NET 4.5 中修复。
静态字段适用于存储不需要过期策略的共享数据。
应用程序状态只不过是一个具有与经典 ASP 兼容的锁定语义的静态字典 - 我只使用它来向后兼容传统的经典 ASP 代码。
使用 Web API 时,缓存的首选应始终是在 HTTP 响应中设置缓存标头。 HttpResponseMessage.CacheControlHeader
.
您的最后一个选项应该是任何取决于HttpContext
或HttpRuntime
,因为这会将您与特定主机联系起来。 Web API 应用程序应独立于其主机进行生成。