全面认识一下.NET 4.0的缓存功能 (转)
转自:http://www.cnblogs.com/hjf1223/archive/2010/07/16/net_4_caching.html
很多关于.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的内存配额:
<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的扩展。
全面认识一下.NET 4.0的缓存功能 (转)的更多相关文章
- .NET 4.0中的缓存功能
# .NET 4.0中的缓存功能 .Net 4.0中有3种,System.Runtime.Caching,System.Web.Caching.Cache,Output.Cache.下面分别对这三者进 ...
- Yii2.0数据库缓存依赖发布的使用理解
对于产品中经常需要生成一些缓存类的东西,比如系统基础配置,商品分类等,每次修改调整后都要手动进行缓存发布,是不是非常麻烦!这时候Yii2.0的缓存依赖发布就起到至关重要的作用了!现将主要的使用流程介绍 ...
- Thinkphp <= 5.0.10 缓存getshell复现
目录 Thinkphp <= 5.0.10 缓存getshell复现 0x01 poc 0x02 跟踪源码 0x03 审计思路 0x04 补丁 0x05 参考 Thinkphp <= 5. ...
- 实战派 | Java项目中玩转Redis6.0客户端缓存!
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是Hydra. 在前面的文章中,我们介绍了Redis6.0中的新特性客户端缓存client-side caching,通过tel ...
- iOS缓存功能
之前做缓存,没有考虑过这个具体的实现. 移动应用在处理网络资源时,一般都会做离线缓存处理,其中以图片缓存最为典型,其中很流行的离线缓存框架为SDWebImage. 但是,离线缓存会占用手机存储空间,所 ...
- iOS开发-清理缓存功能的实现
移动应用在处理网络资源时,一般都会做离线缓存处理,其中以图片缓存最为典型,其中很流行的离线缓存框架为SDWebImage. 但是,离线缓存会占用手机存储空间,所以缓存清理功能基本成为资讯.购物.阅读类 ...
- Nginx 之四: Nginx服务器的压缩功能和缓存功能
在Nginx服务器配置文件中可以通过配置Gzip的使用,可以配置在http块,server 块或者location块中设置,Nginx服务器可以通过ngx_http_gzip_module模块.ngx ...
- iOS开发 - Swift实现清除缓存功能
前言: 开发移动应用时,请求网络资源是再常见不过的功能.如果每次都去请求,不但浪费时间,用户体验也会变差,所以移动应用都会做离线缓存处理,其中已图片缓存最为常见. 但是时间长了,离线缓存会占用大量的手 ...
- nginx的反向代理功能和缓存功能
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...
随机推荐
- 详解Java中的final关键字
本文原文地址:https://jiang-hao.com/articles/2019/coding-java-final-keyword.html1 final 简介2 final关键字可用于多个场景 ...
- 18-hadoop-weather案例
weather案例, 简单分析每年的前三个月的最高温即可, 使用自定义的分组和排序 设计分析 设定多个reduce 每年的数据都很多,如果按照默认情况处理,统计性能是非常慢(因为默认只有一个reduc ...
- WPF 中动态改变控件模板
在某些项目中,可能需要动态的改变控件的模板,例如软件中可以选择不同的主题,在不同的主题下软件界面.控件的样式都会有所不同,这时即可通过改变控件模板的方式实现期望的功能. 基本方法是当用户点击切换主题按 ...
- java 分库关联查询工具类
问题: 由于公司业务扩大,各个子系统陆续迁移和部署在不同的数据源上,这样方便扩容,但是因此引出了一些问题. 举个例子:在查询"订单"(位于订单子系统)列表时,同时需要查询出所关联的 ...
- Qt5——从零开始的Hello World教程(Qt Creator)
简单Qt教程 一.打开Qt Creator 本次的目的是用Qt Creator建立一个Hello World项目,在安装Qt之后,首先要打开Qt Creator. 就是它啦,打开后会显示如下页面. 二 ...
- Java 容器源码分析之HashMap多线程并发问题分析
并发问题的症状 多线程put后可能导致get死循环 从前我们的Java代码因为一些原因使用了HashMap这个东西,但是当时的程序是单线程的,一切都没有问题.后来,我们的程序性能有问题,所以需要变成多 ...
- [转]TFS常用的命令行详解
本文转自:http://blchen.com/tfs-common-commands/ 微软的TFS和Visual Studio整合的非常好,但是在开发过程中,很多时候只用GUI图形界面就会发现一些复 ...
- [转]DevOps的三大原则
本文转自:https://blog.csdn.net/difffate/article/details/77542768 DevOps的出现有其必然性.在软件开发生命周期中,遇到了两次瓶颈. 第一次瓶 ...
- 手机调试 --- 通过chrome测试手机网站
移动端有时候我们要调试手机网站. Chrome怎么调试手机页面呢? 毕竟有时候手机支持的JS度跟PC不一样.最开始就遇见了.手机端浏览器不支持执行string.includes. PC端支持该函数, ...
- AuthenticationManager、ProviderManager
本篇主要讲述以下几点: 1.AuthenticationManager.ProviderManager和AuthenticationProvider三者之间的关系 2.以UsernamePasswor ...