Gie*_*ius 83 c# asp.net-mvc caching c#-4.0
我想知道MemoryCache
和之间是否有任何区别HttpRuntime.Cache
,哪一个在ASP.NET MVC项目中是首选的?
据我所知,两者都是线程安全的,API从一开始就或多或少都是一样的,所以在使用哪个时有什么区别?
Sam*_*ath 78
HttpRuntime.Cache
获取Cache
当前的应用程序.
该MemoryCache
班是类似于ASP.NET Cache
类.
该MemoryCache
班有许多属性和访问缓存,如果你已经使用了ASP.NET,这将是你熟悉的方法Cache
类.
HttpRuntime.Cache
和之间的主要区别在于MemoryCache
后者已被更改为使其可供非ASP.NET应用程序的.NET Framework应用程序使用.
如需额外阅读:
更新:
根据用户的反馈,有时Jon davis博客不起作用.因此我把整篇文章都作为一个图像.请看.
注意:如果不清楚则只需单击图像.之后它将在浏览器上打开.然后再次单击它可以缩放:)
Dee*_*101 23
这是Jon Davis的文章.为了保持可读性,我正在删除现在过时的EntLib部分,介绍和结论.
ASP.NET或System.Web.dll程序集确实具有缓存机制.它从来没有打算在Web上下文之外使用,但它可以在Web之外使用,并且它确实在各种哈希表中执行所有上述过期行为.
在搜索谷歌之后,似乎有不少人讨论过.NET中的内置缓存功能,他们已经在他们的非网络项目中使用了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;
Run Code Online (Sandbox Code Playgroud)
与ASP.NET缓存的工作是记录在MSDN上这里.
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)
});
Run Code Online (Sandbox Code Playgroud)
与ASP.NET缓存不同,您可以实例化MemoryCache对象实例.
注意:它不必是静态的,但应该是 - 这是微软的建议(参见黄色警告).
与ASP.NET缓存的界面相比有一些细微的改进,例如订阅删除事件的能力,而不必在添加项目时存在,冗余的Insert()被删除,项目可以添加CacheItem具有定义缓存策略的初始值设定项的对象,并添加了Contains().
实际上,创建一个执行显式或滑动过期的缓存字典非常简单.(如果您希望自动删除项目以进行内存清除,则会变得更加困难.)以下是您需要做的所有事情:
微软必须支持其原始设计,因为它的用户群已经建立了对它们的依赖,但这并不意味着它们是好的设计.
IDictionary<K,T>
.这使得它更容易使用,因为它的接口作为字典接口更容易预测,而且它使得使用IDictionary <>的助手和扩展方法更容易访问它.在所有这四个选项中,这是我的偏好.我已经实现了这个基本的缓存解决方案.到目前为止,它似乎工作得很好,没有已知的错误(如果有!!请在下面或jon-at-jondavis与我联系),我打算在我需要的所有较小的项目中使用它基本缓存.这里是:
Github链接:https://github.com/kroimon/ExpirableItemDictionary
旧链接:ExpirableItemDictionary.zip
请注意,此博客文章的标题表示"简单缓存",而不是"重载缓存".如果你想深入了解重要的东西,你应该看看专用的,横向扩展的解决方案.