我想知道 和 之间是否有任何区别MemoryCache
,HttpRuntime.Cache
在 ASP.NET MVC 项目中首选哪一个?
据我了解,两者都是线程安全的,API 乍一看或多或少相同,那么何时使用哪个有什么区别?
我想知道 和 之间是否有任何区别MemoryCache
,HttpRuntime.Cache
在 ASP.NET MVC 项目中首选哪一个?
据我了解,两者都是线程安全的,API 乍一看或多或少相同,那么何时使用哪个有什么区别?
HttpRuntime.Cache
获取Cache
当前应用程序的。
该类MemoryCache
类似于 ASP.NETCache
类。
MemoryCache
如果您使用过 ASP.NET 类,该类具有许多用于访问缓存的属性和方法,这些属性和方法您会很熟悉Cache
。
HttpRuntime.Cache
和之间的主要区别在于MemoryCache
后者已被更改,以使其可供非 ASP.NET 应用程序的 .NET Framework 应用程序使用。
如需补充阅读:
更新 :
根据用户反馈,Jon davis 博客有时无法正常工作。因此,我将整篇文章作为图像。请看。
注意:如果不清楚,只需单击图像。之后它将在浏览器上打开。然后再次单击它以放大 :)
这是乔恩戴维斯的文章。为了保持可读性,我删除了现在已经过时的 EntLib 部分、介绍和结论。
ASP.NET 或 System.Web.dll 程序集确实具有缓存机制。它从未打算在 Web 上下文之外使用,但它可以在 Web 之外使用,并且它确实在各种哈希表中执行所有上述过期行为。
在搜索了 Google 之后,似乎很多讨论过 .NET 中内置缓存功能的人都在他们的非 Web 项目中使用了 ASP.NET 缓存。这不再是 .NET 中最可用、最受支持的内置缓存系统;.NET 4 有一个 ObjectCache,我稍后会介绍。Microsoft 一直坚持认为 ASP.NET 缓存不适合在 Web 之外使用。但是很多人仍然停留在 .NET 2.0 和 .NET 3.5 中,需要一些东西来工作,而这恰好适用于很多人,尽管 MSDN 明确表示:
注意:Cache 类不适合在 ASP.NET 应用程序之外使用。它是为在 ASP.NET 中使用而设计和测试的,以便为 Web 应用程序提供缓存。在其他类型的应用程序中,例如控制台应用程序或 Windows 窗体应用程序,ASP.NET 缓存可能无法正常工作。
ASP.NET 缓存的类是 System.Web.dll 中的 System.Web.Caching.Cache。但是,您不能简单地新建一个 Cache 对象。您必须从 System.Web.HttpRuntime.Cache 获取它。
Cache cache = System.Web.HttpRuntime.Cache;
使用 ASP.NET 缓存记录在 MSDN here上。
微软最终在 .NET Framework 的最新版本中实现了一个抽象的 ObjectCache 类,以及一个 MemoryCache 实现,它在非 Web 设置中继承和实现 ObjectCache 以用于内存中的目的。
System.Runtime.Caching.ObjectCache 位于 System.Runtime.Caching.dll 程序集中。它是一个抽象类,它声明了与 ASP.NET 缓存中的基本相同的 .NET 1.0 样式接口。System.Runtime.Caching.MemoryCache
是 ObjectCache 的内存实现,与 ASP.NET 缓存非常相似,只是有一些变化。
要添加具有滑动到期的项目,您的代码将如下所示:
var config = new NameValueCollection();
var cache = new MemoryCache("myMemCache", config);
cache.Add(new CacheItem("a", "b"),
new CacheItemPolicy
{
Priority = CacheItemPriority.NotRemovable,
SlidingExpiration=TimeSpan.FromMinutes(30)
});
与 ASP.NET 缓存不同,您可以实例化 MemoryCache 对象实例。
注意:它不一定是静态的,但它应该是——这是Microsoft 的建议(见黄色警告)。
与 ASP.NET 缓存的接口相比,已经进行了一些细微的改进,例如在添加项目时订阅删除事件的能力,删除多余的 Insert(),可以使用 CacheItem 添加项目具有定义缓存策略的初始化程序的对象,并添加了 Contains()。
创建一个执行显式或滑动过期的缓存字典实际上非常简单。(如果您希望出于清除内存的目的而自动删除项目,这将变得更加困难。)这就是您所要做的:
微软必须支持其原始设计,因为它的用户群已经建立了对它们的依赖,但这并不意味着它们是好的设计。
IDictionary<K,T>
。这使得它更容易使用,因为它的接口作为字典接口更容易预测,而且它更容易被使用 IDictionary<> 的助手和扩展方法访问。在所有这四个选项中,这是我的偏好。我已经实现了这个基本的缓存解决方案。到目前为止,它似乎运行良好,没有已知的错误(请在下面的评论或 jon-at-jondavis 联系我!!),我打算在我所有需要的较小的副项目中使用它基本缓存。这里是:
Github 链接:https ://github.com/kroimon/ExpirableItemDictionary
旧链接:ExpirableItemDictionary.zip
请注意,这篇博客文章的标题表示“简单缓存”,而不是“重型缓存”。如果您想涉足重型领域,您应该考虑专门的横向扩展解决方案。
如果要将经典的 ASP.NET MVC 应用程序迁移到 ASP.NET Core,MemoryCache.Default 也可以充当“桥梁”,因为 Core 中没有“System.Web.Caching”和“HttpRuntime”。
我还写了一个小基准来存储一个bool
项目 20000 次(以及另一个检索它的基准),并且 MemoryCache 似乎慢了两倍(27ms vs 13ms - 这是所有 20k 迭代的总和)但它们都非常快而且这大概可以忽略。
MemoryCache 就是它所说的那样,一个存储在内存中的缓存
HttpRuntime.Cache(参见http://msdn.microsoft.com/en-us/library/system.web.httpruntime.cache(v=vs.100).aspx和http://msdn.microsoft.com/en- us/library/system.web.caching.cache.aspx)坚持到您在应用程序中配置的任何内容。
参见例如“ASP.NET 4.0:编写自定义输出缓存提供程序” http://weblogs.asp.net/gunnarpeipman/archive/2009/11/19/asp-net-4-0-writing-custom-output-cache -providers.aspx