我想知道MemoryCache
和之间是否存在任何差异HttpRuntime.Cache
,在ASP.NET MVC项目中首选哪个?
据我了解,两者都是线程安全的,乍一看API几乎是相同的,那么使用哪个有什么区别?
Answers:
HttpRuntime.Cache
获取Cache
当前应用程序的。
该MemoryCache
班是类似于ASP.NETCache
类。
该MemoryCache
班有许多属性和访问缓存,如果你已经使用了ASP.NET,这将是你熟悉的方法Cache
类。
HttpRuntime.Cache
和之间的主要区别MemoryCache
是后者已更改为可以被非ASP.NET应用程序的.NET Framework应用程序使用。
如需其他阅读:
更新:
根据用户的反馈,有时乔恩·戴维斯(Jon davis)博客无法正常工作,因此我将整篇文章都放在图片中,请注意。
注意:如果不清楚,请单击图像,然后将其在浏览器中打开,然后再次单击以进行缩放:)
这是乔恩·戴维斯(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 Forms应用程序,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上这里。
Microsoft最终在最新版本的.NET Framework中实现了抽象的ObjectCache类,并在非Web设置中实现了MemoryCache实现,该实现继承并实现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()。
创建执行显式或滑动到期的缓存字典实际上非常简单。(如果您要自动清除内容以清除内存,则会变得更加困难。)这是您要做的所有事情:
Microsoft必须支持其原始设计,因为其用户群已经建立了对它们的依赖,但这并不意味着它们是好的设计。
IDictionary<K,T>
。这使它的使用变得更加容易,因为它的接口像字典接口一样可预测,并且它使与IDictionary <>一起使用的助手和扩展方法更易于使用。在所有这四个选项中,这是我的偏爱。我已经实现了这个基本的缓存解决方案。到目前为止,它似乎运行良好,没有已知的错误(请与我联系,并提供下面的评论;如果有,请联系jon-at-jondavis!),我打算在所有需要的小型项目中使用它基本缓存。这里是:
Github链接:https : //github.com/kroimon/ExpirableItemDictionary
旧链接:ExpirableItemDictionary.zip
请注意,此博客文章的标题指示“简单缓存”,而不是“重型缓存”。如果您想了解重型产品,则应查看专用的横向扩展解决方案。
它说的是MemoryCache,即存储在内存中的缓存
HttpRuntime.Cache(请参见http://msdn.microsoft.com/zh-cn/library/system.web.httpruntime.cache(v=vs.100).aspx和http://msdn.microsoft.com/zh-我们/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