caching与缓存
通常,应用程序可以将那些频繁访问的数据,以及那些需要大量处理时间来创建的数据存储在内存中,从而提高性能。例如,如果应用程序使用复杂的逻辑来处理大量数据,然后再将数据作为用户频繁访问的报表返回,避免在用户每次请求数据时重新创建报表可以提高效率。同样,如果应用程序包含一个处理复杂数据但不需要经常更新的页,则在每次请求时服务器都重新创建该页会使工作效率低下。
在这些情况下,为了帮助您提高应用程序的性能,ASP.NET 使用两种基本的缓存机制来提供缓存功能。第一种机制是应用程序缓存,它允许您缓存所生成的数据,如 DataSet 或自定义报表业务对象。第二种机制是页输出缓存,它保存页处理输出,并在用户再次请求该页时,重用所保存的输出,而不是再次处理该页。
应用程序缓存提供了一种编程方式,可通过键/值对将任意数据存储在内存中。使用应用程序缓存与使用应用程序状态类似。但是,与应用程序状态不同的是,应用程序缓存中的数据是易失的,即数据并不是在整个应用程序生命周期中都存储在内存中。使用应用程序缓存的优点是由 ASP.NET 管理缓存,它会在项过期、无效、或内存不足时移除缓存中的项。还可以配置应用程序缓存,以便在移除项时通知应用程序。有关更多信息,请参见缓存应用程序数据。
使用应用程序缓存的模式是,确定在访问某一项时该项是否存在于缓存中,如果存在,则使用。如果该项不存在,则可以重新创建该项,然后将其放回缓存中。这一模式可确保缓存中始终有最新的数据。
页输出缓存在内存中存储处理后的 ASP.NET 页的内容。这一机制允许 ASP.NET 向客户端发送页响应,而不必再次经过页处理生命周期。页输出缓存对于那些不经常更改,但需要大量处理才能创建的页特别有用。例如,如果创建大通信量的网页来显示不需要频繁更新的数据,页输出缓存则可以极大地提高该页的性能。可以分别为每个页配置页缓存,也可以在 Web.config 文件中创建缓存配置文件。利用缓存配置文件,只定义一次缓存设置就可以在多个页中使用这些设置。
页输出缓存提供了两种页缓存模型:整页缓存和部分页缓存。整页缓存允许将页的全部内容保存在内存中,并用于完成客户端请求。部分页缓存允许缓存页的部分内容,其他部分则为动态内容。有关更多信息,请参见缓存 ASP.NET 页。
部分页缓存可采用两种工作方式:控件缓存和缓存后替换。控件缓存有时也称为分段缓存,这种方式允许将信息包含在一个用户控件内,然后将该用户控件标记为可缓存的,以此来缓存页输出的部分内容。这一方式可缓存页中的特定内容,并不缓存整个页,因此每次都需重新创建整个页。例如,如果要创建一个显示大量动态内容(如股票信息)的页,其中有些部分为静态内容(如每周总结),这时可以将静态部分放在用户控件中,并允许缓存这些内容。
缓存后替换与控件缓存正好相反。这种方式缓存整个页,但页中的各段都是动态的。例如,如果要创建一个在规定时间段内为静态的页,则可以将整个页设置为进行缓存。如果向页添加一个显示用户名的 Label 控件,则对于每次页刷新和每个用户而言,Label 的内容都将保持不变,始终显示缓存该页之前请求该页的用户的姓名。但是,使用缓存后替换机制,可以将页配置为进行缓存,但将页的个别部分标记为不可缓存。在此情况下,可以向不可缓存部分添加 Label 控件,这样将为每个用户和每次页请求动态创建这些控件。有关更多信息,请参见 缓存 ASP.NET 页的某些部分。
根据请求参数缓存页
除缓存页的单一版本外,ASP.NET 页输出缓存还提供了一些功能,可以创建根据请求参数的不同而不同的页的多个版本。有关更多信息,请参见 缓存页的多个版本。
出于以下原因之一,ASP.NET 可以从缓存中移除数据:
- 由于服务器上的内存不足,开始一个称为"清理"的过程。
- 由于缓存中的项已过期。
- 由于项的依赖项发生了更改。
为了帮助管理缓存项,在将项从缓存中移除时,ASP.NET 会通知应用程序。
清理
清理是在内存不足时从缓存中删除项的过程。如果某些项在一段时间内未被访问,或是在添加到缓存中时被标记为低优先级,则这些项会被移除。ASP.NET 使用 CacheItemPriority 对象来确定要首先清理的项。有关更多信息,请参见如何:将项添加到缓存中。
过期
除了清理外,在缓存项过期时,ASP.NET 会自动从缓存中移除这些项。向缓存添加项时,可以按下表中的描述设置其过期时间。
过期类型 |
说明 |
可调过期 |
指定某项自上次被访问后多长时间过期。例如,可以将某项设置为自上次在缓存中被访问后 20 分钟过期。 |
绝对过期 |
指定某项在设定的时间过期,而不考虑访问频率。例如,可以将某项设置为在 6:00 PM 过期,或四小时后过期。 |
依赖项
可以将缓存中某一项的生存期配置为依赖于其他应用程序元素,如某个文件或数据库。当缓存项依赖的元素更改时,ASP.NET 将从缓存中移除该项。例如,如果您的网站显示一份报告,该报告是应用程序通过 XML 文件创建的,您可以将该报告放置在缓存中,并将其配置为依赖于该 XML 文件。当 XML 文件更改时,ASP.NET 会从缓存中移除该报告。当代码请求该报告时,代码会先确定该报告是否在缓存中,如果不在,代码会重新创建该报告。因此,始终都有最新版本的报告可用。
ASP.NET 缓存支持下表中描述的依赖项。
依赖项 |
说明 |
键依赖项 |
应用程序缓存中的项存储在键/值对中。键依赖项允许项依赖于应用程序缓存中另一项的键。如果移除了原始项,则具有键依赖关系的项也会被移除。例如,可以添加一个名为 ReportsValid 的缓存项,然后缓存若干个依赖于 ReportsValid 键的报告。当ReportsValid 项被移除时,所有依赖于它的缓存报告同样也会从缓存中移除。 |
文件依赖项 |
缓存中的项依赖于外部文件。如果该文件被修改或删除,则缓存项也会被移除。 |
SQL 依赖项 |
缓存中的项依赖于 Microsoft SQL Server 2005、SQL Server 2000 或 SQL Server 7.0 数据库中表的更改。对于 SQL Server 2005,缓存中的项可依赖于表中的某一行。有关更多信息,请参见 使用 SqlCacheDependency 类在 ASP.NET 中缓存。 |
聚合依赖项 |
通过使用 AggregateCacheDependency 类缓存中的项依赖于多个元素。如果任何依赖项发生更改,该项都会从缓存中移除。 |
自定义依赖项 |
可以用您自己的代码创建的依赖关系来配置缓存中的项。例如,可以创建一个自定义 Web 服务缓存依赖项,当调用 Web 服务得到一个特定值时,该依赖项就会从缓存中移除数据。 |
当项从应用程序缓存中移除时,您可以收到通知。例如,如果有一个需要大量处理时间才能创建的项,当从缓存中移除该项时,您会收到通知以便可以立即替换该项。这样,下次请求该项时,用户便不必等待处理该项。有关更多信息,请参见如何:从缓存中移除项时通知应用程序。
在ASP.NET MVC中,Cache可从HttpContext访问,它是System.Web.Cache的一个实例,目前公司框架中在Web应用时的缓存也是使用这个Cache类
缓存添加
- Cache["CacheItem1"] = "Cached Item 1";
- Cache.Insert("CacheItem2", "Cached Item 2");
- //CacheedItem9的值为"Cached Item 9"
- string CachedItem9 = (string)Cache.Add("CacheItem9",
- "Cached Item 9", null,
- System.Web.Caching.Cache.NoAbsoluteExpiration,
- System.Web.Caching.Cache.NoSlidingExpiration,
- System.Web.Caching.CacheItemPriority.Default,
- null);
通过指定依赖项向缓存添加项
- string[] dependencies = { "CacheItem2" };
- Cache.Insert("CacheItem3", "Cached Item 3",
- new System.Web.Caching.CacheDependency(null, dependencies));
- Cache.Insert("CacheItem4", "Cached Item 4",
- new System.Web.Caching.CacheDependency(
- Server.MapPath("XMLFile.xml")));
添加多个依赖项
- System.Web.Caching.CacheDependency dep1 =
- new System.Web.Caching.CacheDependency(Server.MapPath("XMLFile.xml"));
- string[] keyDependencies2 = { "CacheItem1" };
- System.Web.Caching.CacheDependency dep2 =
- new System.Web.Caching.CacheDependency(null, keyDependencies2);
- System.Web.Caching.AggregateCacheDependency aggDep =
- new System.Web.Caching.AggregateCacheDependency();
- aggDep.Add(dep1);
- aggDep.Add(dep2);
- Cache.Insert("CacheItem5", "Cached Item 5", aggDep);
将设有过期策略的项添加到缓存中
- //下面的代码示例将有一分钟绝对过期时间的项添加到缓存中:即缓存会在插入后一分钟过期
- Cache.Insert("CacheItem6", "Cached Item 6",
- null, DateTime.Now.AddMinutes(1d),
- System.Web.Caching.Cache.NoSlidingExpiration);
- //下面的代码示例将有 10 分钟弹性过期时间的项添加到缓存中:即缓存会最后一次访问的10分钟后过期,如每在10分钟内都访问一次,缓存则不会过期。
- Cache.Insert("CacheItem7", "Cached Item 7",
- null, System.Web.Caching.Cache.NoAbsoluteExpiration,
- new TimeSpan(, , ));
将设有优先级设置的项添加到缓存中
- //下面的代码示例将优先级值为 High 的项添加到缓存中:
- Cache.Insert("CacheItem8", "Cached Item 8",
- null, System.Web.Caching.Cache.NoAbsoluteExpiration,
- System.Web.Caching.Cache.NoSlidingExpiration,
- System.Web.Caching.CacheItemPriority.High, null);
要从缓存中检索数据,应指定存储缓存项的键。不过,由于缓存中所存储的信息为易失信息,即该信息可能由 ASP.NET 移除,因此建议的开发模式是首先确定该项是否在缓存中。如果不在,则应将它重新添加到缓存中,然后检索该项。
检索缓存项的值
- string cachedString;
- cachedString = (string)Cache["CacheItem"];
- if (cachedString == null)
- {
- cachedString = "Hello, World.";
- Cache.Insert("CacheItem", cachedString);
- }
ASP.NET 缓存中的数据是易失的,即不能永久保存。由于以下任一原因,缓存中的数据可能会自动移除:
- 缓存已满。
- 该项已过期。
- 依赖项发生更改。
从缓存中显式删除项
- Cache.Remove("MyData1");
从缓存中移除项时通知应用程序
- //在Add方法中添加有个参数是传入一个CacheItemRemovedCallback的委托,这个委托在缓存被清理时调用,
- Cache.Add("MyReport",
- CreateReport(), null, DateTime.MaxValue,
- new TimeSpan(, , ),
- System.Web.Caching.CacheItemPriority.Default,
- ReportRemovedCallback);
委托的定义如下,CacheItemRemovedReason是一个枚举,传递缓存被移除的原因,
- public delegate void CacheItemRemovedCallback(string key, object value, CacheItemRemovedReason reason);
在Web.Config中,对缓存设置如下
- <caching>
- <!--定义全局应用程序缓存设置。-->
- <cache
- <!-- 是否当计算机处于内存压力下时是否禁止执行缓存内存回收。-->
- disableMemoryCollection = "false"
- <!--是否禁用缓存过期。如果禁用,则缓存项不会过期,并且不会对过期缓存项执行后台清理。
- -->
- disableExpiration = "false"
- <!--指示在缓存开始刷新过期项并尝试回收内存之前应用程序的最大专用字节大小。此限制同时包括缓存所使用的内存量以及运行应用程序的正常内存开销。如果设置为零,则指示 ASP.NET 将使用自己的试探法确定何时开始回收内存。
- -->
- privateBytesLimit = "0"
- <!--指示在缓存开始刷新过期项并尝试回收内存之前应用程序可使用的最大计算机物理内存百分比。该内存使用率同时包括缓存使用的内存以及正运行的应用程序的正常内存使用率。如果设置为零,则指示 ASP.NET 将使用自己的试探法确定何时开始回收内存。-->
- percentagePhysicalMemoryUsedLimit = "90"
- <!--指示两次轮询应用程序专用字节内存使用量之间的时间间隔。
- -->
- privateBytesPollTime = "00:02:00"/>
- <outputCache enableOutputCache = "true"
- enableFragmentCache = "true"
- sendCacheControlHeader = "true"
- omitVaryStar = "false" >
- </outputCache><!--指定应用程序范围的输出缓存设置。-->
- <outputCacheSettings>
- <outputCacheProfiles>
- <add name = ""
- enabled = "true"
- duration = "-1"
- location = ""
- sqlDependency = ""
- varyByCustom = ""
- varyByControl = ""
- varyByHeader = ""
- varyByParam = ""
- noStore = "false"/>
- </outputCacheProfiles>
- </outputCacheSettings><!--指定可以应用于应用程序中页的输出缓存设置。-->
- <outputCacheSettings>
- <outputCacheProfiles>
- <clear />
- </outputCacheProfiles>
- </outputCacheSettings>
- <sqlCacheDependency enabled = "true"
- pollTime = "60000">
- <databases>
- <add name = ""
- connectionStringName = ""
- pollTime = "60000"/>
- </databases>
- </sqlCacheDependency><!--为 ASP.NET 应用程序配置 SQL 缓存依赖项。-->
- </caching>
针对上面以介绍应用程序缓存为主。只有cache节点对其有影响。
caching与缓存的更多相关文章
- No caching ——无缓存工具
No caching ——无缓存工具 无缓存工具阻止客户端应用程序(如Web浏览器)缓存任何资源,因此,请求总是发送到远程站点,所以我们总能看到最新版本. 适用场景 开发每次新部署了一版环境,说解决了 ...
- restapi(9)- caching, akka-http 缓存
restapi作为前后端交互的枢纽:面对大批量的前端请求,需要确保回复的及时性.使用缓存是一项有效工具.我们可以把多数前端请求的回复response存入缓存,特别是一些需要大量计算才能获取的回复值,更 ...
- System.Web.Caching.Cache缓存帮助类
/// <summary> /// 缓存帮助类 /// </summary> public class CacheHelper { /// <summary> // ...
- 使用Donut Caching和Donut Hole Caching在ASP.NET MVC应用中缓存页面
Donut Caching是缓存除了部分内容以外的整个页面的最好的方式,在它出现之前,我们使用"输出缓存"来缓存整个页面. 何时使用Donut Caching 假设你有一个应用程序 ...
- 深入System.Web.Caching命名空间 教你Hold住缓存管理
一,System .Web.Caching与缓存工作机制简介 System.Web.Caching是用来管理缓存的命名空间,其父级空间是System.Web,由此可见,缓存通常用于Web网站的开发,包 ...
- 探索ASP.NET MVC5系列之~~~5.缓存篇(页面缓存+二级缓存)
其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...
- MVC缓存
MVC入门系列教程-视频版本,已入驻51CTO学院,文本+视频学效果更好哦.视频链接地址如下: 点我查看视频.另外,针对该系列教程博主提供有偿技术支持,群号:226090960,群内会针对该教程的问题 ...
- MVC缓存OutputCacheAttribute 类提高网站效率(转)
原文转自:http://www.cnblogs.com/iamlilinfeng/p/4419362.html 命名空间: System.Web.Mvc 程序集: System.Web.Mvc(在 ...
- MVC缓存技术
一.MVC缓存简介 缓存是将信息(数据或页面)放在内存中以避免频繁的数据库存储或执行整个页面的生命周期,直到缓存的信息过期或依赖变更才再次从数据库中读取数据或重新执行页面的生命周期.在系统优化过程中, ...
随机推荐
- 如何使用Microsoft技术栈
Microsoft技术栈最近有大量的变迁,这使得开发人员和领导者都想知道他们到底应该关注哪些技术.Microsoft自己并不想从官方层面上反对Silverlight这样的技术,相对而言他们更喜欢让这种 ...
- ASP.NET Web API 接口执行时间监控
软件产品常常会出现这样的情况:产品性能因某些无法预料的瓶颈而受到干扰,导致程序的处理效率降低,性能得不到充分的发挥.如何快速有效地找到软件产品的性能瓶颈,则是我们感兴趣的内容之一. 在本文中,我将解释 ...
- .NET Core中遇到奇怪的线程死锁问题:内存与线程数不停地增长
一个 asp.net core 站点,之前运行在Linux 服务器上,运行一段时间后有时站点会挂掉,在日志中记录很多“EMFILE too many open files”的错误: Microsoft ...
- 深入浅出NodeJS——数据通信,NET模块运行机制
互联网的运作,最根本的驱动就是信息的交互,NodeJS 在数据交互这一块做的很带感,异步编程让人很惬意,关于 NodeJS 的数据通信,最基础的两个模块是 NET 和 HTTP,前者是基于 TCP 的 ...
- ARM的常数表达式
ARM的常数表达式 如果说Intel指令中的立即数,相信大家都很熟悉.类似的,Arm指令中的“立即数”就是常数表达式.之所以称为常数表达式,而不称为立即数是有原因的. Intel指令属于CISC指 ...
- [nRF51822] 10、基础实验代码解析大全 · 实验15 - RTC
一.实验内容: 配置NRF51822 的RTC0 的TICK 频率为8Hz,COMPARE0 匹配事件触发周期为3 秒,并使能了TICK 和COMPARE0 中断. TICK 中断中驱动指示灯D1 翻 ...
- VVDocumenter 使用
函数说明文档插件下载链接 https://github.com/onevcat/VVDocumenter-Xcode 下载后,直接运行项目 升级Xcode后可能不能再次使用,需要做一些处理从Xcode ...
- 2013 duilib入门简明教程 -- 第一个程序 Hello World(3)
小伙伴们有点迫不及待了么,来看一看Hello World吧: 新建一个空的win32项目,新建一个main.cpp文件,将以下代码复制进去: #include <windows.h> #i ...
- JS-underfined is not a function
- LINQ系列:Linq to Object串联操作符
串联是一个将两个对象联接在一起的过程.在LINQ中,串联操作将两个集合合并成一个集合,通过Concat操作符实现. Concat 1>. 原型定义 public static IQueryabl ...