很多关于.NET 4.0新特性的介绍,缓存功能的增强肯定是不会被忽略的一个重要亮点。在很多文档中都会介绍到在.NET 4.0中,缓存功能的增强主要是在扩展性方面做了改进,改变了原来只能利用内存进行缓存的局限,允许用户在不改变代码的情况下通过修改配置的方式,灵活的切换缓存介质。Cache Provider是可扩展的,开发人员可以方便的将缓存存放在文件中,也可以扩展使用分布式缓存。然而,由于之前已经有System.Web.Caching.Cache这个缓存对象的存在,让我一直对.NET 4.0的新的Cache和原来已存在的System.Web.Caching.Cache的关系产生了一定的迷惑。通过这一两天的研究,让我慢慢解开了这层迷惑。

回顾.NET 4.0以前的缓存功能

事实上,在.NET4.0以前并没有存在一个实际意义上的.NET Framework的缓存框架,实际上它是一个专为ASP.NET设计的缓存框架。在ASP.NET中,缓存分为两种:输出缓存(Output Cache)和数据缓存。输出缓存是用在需要对已经生成好的页面HTML或页面中部分HTML(User Control)进行缓存,减少某些静态内容的生成次数,从而提高请求响应时间。数据缓存,是开发人员希望缓存某些常用、并且极少更新的数据,让这些数据缓存在内存中,以减少数据的读取次数,从而提高程序的性能。而这两种缓存都是使用System.Web.Caching.Cache来缓存数据。

System.Web.Caching.Cache

它是一个内存缓存的实现,并不提供缓存介质的扩展,数据直接缓存在内存中。这个对象一般情况下,我们不会自己去实例化。通常在页面里面,我们会直接使用Page.Cache进行缓存操作,而不会去关心它是如何被实例化的。而在页面以外的地方要使用缓存,我们可以通过全局的System.Web.Context.Current.Cache来进行缓存操作,同样的你还可以使用System.HttpRuntime.Cache。其实如果我们通过Reflector去追踪这几个对象的关系,你不难发现虽然有这么多地方都有Cache对象,实际上它们都是引用同一个对象,那就是HttpRuntime.Cache这个对象。特别要注意的是,System.HttpRuntime.Cache不仅仅可用于Web环境下,它也可以在任何程序中使用,包括WinForm,Console Application,但是前提是你必须引用System.Web.dll。这也就说明了,System.Web.Caching.Cache这个对象完全是可以脱离于System.Web这个名称空间,而作为一个独立的缓存框架而存在。这也是我迷惑的第一个地方:System.Web.Caching.Cache会不会改变现有的实现,而直接使用新的可扩展的缓存框架?

.NET 4.0中的缓存功能全解析

.NET 4.0的缓存功功由三部分组成:System.Runtime.Caching,System.Web.Caching.Cache和Output Cache。下面分别对这三者以及它们之前的关系进行解析:

System.Runtime.Caching

这是在.NET 4.0中新增的缓存框架,存在于程序集System.Runtime.Caching.dll,在这份PPT中提到的System.Caching指的就是它。它是一个可扩展的数据缓存框架,内置提供了内存缓存的实现MemoryCache。但是它在使用上却不是那么可扩展,除了提供ObjectCache这个抽象类外,并没有提供可扩展的配置方案,我们无法通过配置方案来切换ObjectCache的实现,我们必须在代码里面硬编码我们要使用的ObjectCache实现:

?

1

ObjectCache objectCache = MemoryCache.Default;//

System.Runtime.Caching.Configuration里面的配置也是针对MemoryCache。这些配置意义在于指定每个MemoryCache实例运行的内存使用配额方案,和配额检查周期。MemoryCache.Default的实例名称为“Default”,这样我们就可以通过下面的配置来更改MemoryCache.Default的内存配额:

?

1

2

3

4

5

6

7

<system.runtime.caching>

<memoryCache>

<namedCaches>

<add name="Default" cacheMemoryLimitMegabytes="10" pollingInterval="00:02:00"/>

</namedCaches>

</memoryCache>

</system.runtime.caching>

缓存过期策略与其它的缓存框架大同小异,与System.Web.Caching.Cache的不同只是名称不叫CacheDependency,而叫ChangeMonitor,并且提供了基于文件和目录的缓存依赖策略。

System.Web.Caching.Cache

原先我一直在找答案,System.WebCaching.Cache底层是否改为使用System.Runtime.Caching,得到的结果是它没有任何的变化。

Output Cache

Output Cache有了比较大的变化,ASP.NET 4.0之前的版本都是直接使用System.Web.Caching.Cache来缓存HTML片段。在ASP.NET 4.0中对它进行了重新设计,提供了一个OutputCacheProvider供开发人员进行扩展,但是它默认情况下,仍然使用System.Web.Caching.Cache来做做缓存。关于ASP.NET 4.0的Output Cache的使用,请参考ScottGU的文章。

以上,我们可以得出的结果是,System.Runtime.Caching和Output Cache是可扩展的。并且,他们二者之间没有任何关系,提供的扩展接口差别也非常大,需要分别进行实现。System.Runtime.Caching完全可以用于替代Enterprise Library Cache Application Block的作用,并且微软所发布的分布式缓存框架Windows Server AppFabric应该已经提供了System.Runtime.Caching的扩展。

http://www.cnblogs.com/hjf1223/archive/2010/07/16/1779148.html

转载于:https://www.cnblogs.com/luckjason/archive/2012/08/02/2619862.html

全面认识一下.NET 4.0的缓存功能相关推荐

  1. opengles2.0 帧缓存对象(FBO)

    opengles2.0 帧缓存对象(FBO) 帧缓存对象(fbo)主要是用于做渲染到纹理. opengles2.0渲染到纹理的方法有三种: 第一,使用glCopyTexImage2D或者glCopyT ...

  2. ASP.NET 2.0的页面缓存功能介绍

    页面部分缓存是指输出缓存页面的某些部分,而不是缓存整个页面内容.实现页面部分缓存有两种机制:一种是将页面中需要缓存的部分置于用户控件(.ascx文件)中,并且为用户控件设置缓存功能(包含用户控件的AS ...

  3. ASP.NET 2.0 中改进的缓存功能

    摘要:本文中,Stephen Walther 将重点介绍 ASP.NET 2.0 中新增的缓存功能,以及如何使用这些新功能改进 ASP.NET 应用程序的性能和可扩展性.(本文包含一些指向英文站点的链 ...

  4. 实战派 | Java项目中玩转Redis6.0客户端缓存

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是Hydra. 在前面的文章中,我们介绍了Redis6.0中的新特性客户端缓存client-side caching,通过tel ...

  5. 使用Nginx的proxy_cache缓存功能取代Squid

    [文章作者:张宴 本文版本:v1.2 最后修改:2009.01.12 转载请注明原文链接:http://blog.s135.com/nginx_cache/] Nginx从0.7.48版本开始,支持了 ...

  6. 使用Nginx的proxy_cache缓存功能取代Squid[原创]

    使用Nginx的proxy_cache缓存功能取代Squid[原创] [文章作者:张宴 本文版本:v1.2 最后修改:2009.01.12 转载请注明原文链接:http://blog.zyan.cc/ ...

  7. php怎么实现缓存,PHP怎么实现缓存功能_后端开发

    PHP7 垃圾回收机制(GC)解析_后端开发 垃圾回收机制是一种动态存储分配方案.它会自动释放程序不再需要的已分配的内存块. 自动回收内存的过程叫垃圾收集.垃圾回收机制可以让程序员不必过分关心程序内存 ...

  8. php分布式cache,thinkPHP实现MemCache分布式缓存功能

    本文实例讲述了thinkPHP实现MemCache分布式缓存功能.分享给大家供大家参考,具体如下: 两天在研究MemCache分布式缓存的问题时,发现ThinkPHP其实并不支持分布式缓存功能,这可以 ...

  9. ASP.NET MVC:缓存功能的设计及问题

    ASP.NET MVC:缓存功能的设计及问题 这是非常详尽的asp.net mvc中的outputcache 的使用文章. [原文:陈希章 http://www.cnblogs.com/chenxiz ...

最新文章

  1. java统计大于0的个数_java中0的问题(依据0统计数量时出错)
  2. 防止在iOS设备中的Safari将数字识别为电话号码
  3. caffe 问题集锦之使用cmake编译多GPU时,更改USE_NCCL=1无效
  4. oracle第二章数据的运用,第二章:oracle_sql语句之限制(where子句)和排列数据(order by子句)...
  5. 网上有打印按键怎么设置下载_打印机共享怎么设置 如何设置打印机共享【详细攻略】...
  6. 入门之路:“机器学习初学者”公众号2019年的精选原创文章
  7. Unity2017.1官方UGUI文档翻译——Auto Layout
  8. linux中使用yum的优点,linux – 自动“yum update”以保证服务器安全 – 优点和缺点?...
  9. P5055 【模板】可持久化文艺平衡树
  10. Java实现qq截图工具
  11. 【操作系统】大内核和微内核的比较
  12. bootstrap设计登录页面_前端小白如何在10分钟内打造一个爆款Web响应式登录界面?...
  13. .Net语言 APP开发平台——Smobiler学习日志:如何设置页面的title
  14. python网络通信中cs架构_python3基于TCP实现CS架构文件传输
  15. Structs2文件上传以及预览
  16. 电容或电感的电压_低成本电容电感测量电路
  17. django登录注册html页面,Django实现页面注册登录界面
  18. 安全架构--13--企业资产管理体系建设总结
  19. html 图片滚动 放大缩小,js实现图片旋转 js滚动鼠标中间对图片放大缩小
  20. 快递100企业版接口(API)云打印、电子面单实现Java版

热门文章

  1. java 合并txt文件_java合并文本文件并删除文件中重复行
  2. c++采集声卡输出_耳上明珠 | 魅族双 C 耳机 — EP2C
  3. mac mysql phpmyadmin_Mac下搭建PHP开发环境(Apache+PHP+MySQL+phpMyAdmin)
  4. server vscode中的live_太方便了!这款神器能在浏览器中运行 VS Code,随时随地写代码...
  5. endnote能自动翻译吗_人工智能能翻译古文吗?跟小编点评专业翻译PK人工智能翻译...
  6. python升级知识整理 第五节:文件整理
  7. visual studio2010-2015编译部署caffe
  8. SVM进行手写数字识别
  9. MXNET源码中TShape值的获取和打印
  10. java优先级目数_10.Java运算符+(优先级、目数)+