我想知道MemoryCache
和HttpRuntime.Cache
之间是否存在任何差异,哪一个在ASP.NET MVC项目中是首选?
据我了解,两者都是线程安全的,API乍一看或多或少相同,所以使用时有什么区别吗?
答案 0 :(得分:77)
HttpRuntime.Cache
获取当前应用的Cache
。
MemoryCache
类类似于ASP.NET Cache
类。
如果您使用了ASP.NET MemoryCache
类,Cache
类有许多用于访问缓存的属性和方法。
HttpRuntime.Cache
和MemoryCache
之间的主要区别在于后者已被更改为可供非ASP.NET应用程序的.NET Framework应用程序使用。
进一步阅读:
更新:
根据用户的反馈,有时Jon davis博客不起作用。因此我把整篇文章都作为一个图像。请看。
注意:如果不清楚则只需点击图片。之后它会在浏览器上打开。然后再次点击它来缩放:)
答案 1 :(得分:21)
这是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;
MSDN here上记录了使用ASP.NET缓存。
Microsoft最终在最新版本的.NET Framework中实现了一个抽象的ObjectCache类,以及一个在非Web设置中为内存目的继承和实现ObjectCache的MemoryCache实现。
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’s recommendation (see yellow Caution)。
对ASP.NET缓存的界面进行了一些细微的改进,例如订阅删除事件的能力,而不必在添加项目时删除,冗余的Insert()被删除,项目可以使用CacheItem对象添加一个定义缓存策略的初始化程序,并添加Contains()。
创建一个执行显式或滑动过期的缓存字典实际上非常简单。 (如果您希望自动删除项目以进行内存清除,则会变得更加困难。)以下是您需要做的所有事情:
微软必须支持其原始设计,因为它的用户群已经建立了对它们的依赖,但这并不意味着它们是好的设计。
IDictionary<K,T>
。这使得它更容易使用,因为它的界面作为字典界面更容易预测,而且它使得使用IDictionary&lt;&gt;的帮助程序和扩展方法更容易访问。在所有这四个选项中,这是我的偏好。我已经实现了这个基本的缓存解决方案。到目前为止,它似乎工作得很好,没有已知的错误(如果有!!请在下面或jon-at-jondavis与我联系),我打算在我需要的所有较小的项目中使用它基本缓存。这是:
Github链接:https://github.com/kroimon/ExpirableItemDictionary
旧链接:ExpirableItemDictionary.zip
请注意,此博客文章的标题表示“简单缓存”,而不是“重载缓存”。如果你想深入了解重要的事情,你应该看看专门的,扩展的解决方案。
答案 2 :(得分:3)
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
答案 3 :(得分:2)
如果要将经典的ASP.NET MVC应用程序迁移到ASP.NET Core,则MemoryCache.Default也可以充当“桥梁”,因为Core中没有“ System.Web.Caching”和“ HttpRuntime”。 / p>
我还写了一个小型基准来存储20000次bool
项目(以及另一个用于检索它的基准),而MemoryCache似乎要慢两倍(27ms vs 13ms-总计)对于所有20k迭代),但它们都非常快,因此可以忽略。