C# System.Runtime.Caching.MemoryCache与HttpRuntime.Cache-有什么区别吗?

C# System.Runtime.Caching.MemoryCache与HttpRuntime.Cache-有什么区别吗?,c#,asp.net-mvc,c#-4.0,caching,C#,Asp.net Mvc,C# 4.0,Caching,我想知道MemoryCache和HttpRuntime.Cache之间是否有任何区别,在ASP.NET MVC项目中首选哪一种 据我所知,两者都是线程安全的,API乍一看或多或少是相同的,所以在使用哪个API时有什么区别?获取当前应用程序的 该类类似于ASP.NET缓存类 MemoryCache类有许多属性和方法用于访问缓存,如果您使用过ASP.NETcache类,您将很熟悉这些属性和方法 HttpRuntime.Cache和MemoryCache之间的主要区别在于后者已被更改为可供非ASP.N

我想知道
MemoryCache
HttpRuntime.Cache
之间是否有任何区别,在ASP.NET MVC项目中首选哪一种

据我所知,两者都是线程安全的,API乍一看或多或少是相同的,所以在使用哪个API时有什么区别?

获取当前应用程序的

该类类似于ASP.NET
缓存

MemoryCache
类有许多属性和方法用于访问缓存,如果您使用过ASP.NET
cache
类,您将很熟悉这些属性和方法

HttpRuntime.Cache
MemoryCache
之间的主要区别在于后者已被更改为可供非ASP.NET应用程序的.NET Framework应用程序使用

补充阅读:

更新:

根据用户反馈,有时候JonDavis的博客不起作用。因此我把整篇文章作为一个图片。请看

注意:如果不清楚,只需单击图像。之后,它将在浏览器上打开。然后再次单击以缩放:)


内存缓存就是它所说的,一种存储在内存中的缓存

缓存(请参阅和)将持久化到您在应用程序中配置它的任何内容

例如,请参见“ASP.NET 4.0:编写自定义输出缓存提供程序”
这是乔恩·戴维斯的文章。为了保持可读性,我删掉了现在已经过时的EntLib部分、简介以及结论


ASP.NET缓存 ASP.NET或System.Web.dll程序集确实具有缓存机制。它从来没有打算在web上下文之外使用,但是它可以在web之外使用,并且它在各种哈希表中执行上述所有过期行为

在浏览了Google之后,似乎有不少人讨论了.NET中的内置缓存功能,他们在非web项目中使用了ASP.NET缓存。这不再是.NET;中最可用、最受支持的内置缓存系统。NET4有一个ObjectCache,我稍后将进入它。Microsoft始终坚持ASP.NET缓存不用于web之外的用途。但许多人仍然被困在.NET 2.0和.NET 3.5中,需要一些东西来处理,这对许多人来说都是可行的,尽管MSDN明确指出:

注意:缓存类不打算在ASP.NET应用程序之外使用。它是为在ASP.NET中为Web应用程序提供缓存而设计和测试的。在其他类型的应用程序(如控制台应用程序或Windows窗体应用程序)中,ASP.NET缓存可能无法正常工作

ASP.NET缓存的类是System.Web.dll中的System.Web.Caching.cache。但是,不能简单地新建缓存对象。您必须从System.Web.HttpRuntime.Cache获取它

Cache cache = System.Web.HttpRuntime.Cache;
MSDN中记录了使用ASP.NET缓存的过程

赞成的意见:
  • 它是内置的
  • 尽管有.NET1.0语法,但它使用起来相当简单
  • 在web环境中使用时,它经过了良好的测试。在网络环境之外,根据谷歌搜索,人们并不知道它会引起问题,尽管微软建议不要这样做,只要你使用的是.NET2.0或更高版本
  • 当项目被删除时,可以通过代理通知您,如果您需要使其保持活动状态,并且无法预先设置项目的优先级,则必须这样做
  • 在本文顶部的删除方法列表中,单个项目具有(a)、(b)或(c)种过期和删除方法的灵活性。您还可以将过期行为与物理文件的存在相关联
  • 欺骗:
  • 它不仅是静态的,而且只有一个。不能使用自己的缓存静态实例创建自己的类型。整个应用程序只能有一个bucket,句号。您可以使用自己的包装器来包装bucket,这些包装器可以在键中预插入前缀,并在将键/值对拉回来时删除这些前缀。但仍然只有一个桶。所有的东西都集中在一起了。例如,如果您有一个需要分别缓存三种或四种不同类型数据的服务,那么这可能会非常麻烦。对于极其简单的项目来说,这应该不是什么大问题。但是,如果一个项目由于其需求而具有很大程度的复杂性,ASP.NET缓存通常是不够的
  • 项目可以任意消失。很多人都没有意识到这一点——我没有意识到,直到我更新了关于这个缓存实现的知识。默认情况下,ASP.NET缓存设计为在“感觉”到项目时销毁项目。更具体地说,请参见本文顶部我对缓存表的定义中的(c)。如果同一进程中的另一个线程正在处理完全不同的事情,并且它将高优先级项目转储到缓存中,那么一旦.NET决定它需要一些内存,它就会开始根据优先级销毁缓存中的一些项目,首先降低优先级。此处记录的所有用于添加缓存项的示例都使用默认优先级,而不是NotRemovable优先级值,该值可防止出于内存清理目的删除缓存项,但仍将根据过期策略删除缓存项。在缓存调用中添加CacheItemPriority.NotRemovable可能会很麻烦,否则就需要一个包装器
  • 键必须是字符串。例如,如果正在缓存数据记录,其中记录的键是长或整数,则必须首先将键转换为字符串
  • 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)  
        });