ASP.NET缓存
缓存 | |||||||||||
将对象添加进Cache对象后,并不保证它一直在那里。Cache对象支持清除功能;当系统资源紧张时它自动地从缓存中删除低优先级的或很少使用的对象。 | |||||||||||
页面输出缓存 | |||||||||||
利用页面输出缓存来提高ASP.NET页面的性能; | |||||||||||
注意:页面的每个缓存副本都会占用内存。所以,缓存的页面版本越多,消耗的服务器资源就越多; | |||||||||||
要想为一个页面启用输出缓存,在页面中包含以下page指令: | |||||||||||
<% @ OutputCache Duration="300" VaryByParam="none" VaryByHeader="User-Agent" VaryByCustom="Browser" Location="Any" %> | |||||||||||
Duration | |||||||||||
缓存页面的期限,单位(秒);在任何情况下被缓存内容在5分钟后将从输出缓存中删除; | |||||||||||
VaryByParam | |||||||||||
指出当前页面请求包含参数时应该如何缓存页面。 | |||||||||||
VaryByParam="none":指出当页面包含不同的参数时,不应该创建页面的不同的缓存版本; | |||||||||||
VaryByParam="*":指出只要页面请求包含不同的参数,就应该创建页面的不同缓存版本; | |||||||||||
VaryByParam="参数名1[;参数名2][;参数名3][.....]":只要页面请求包含指定不同的参数,就应该创建不同的缓存版本; | |||||||||||
VaryByHeader | |||||||||||
VaryByHeader="User-Agent":因为ASP.NET框架中的控件可以探测用来请求页面的浏览器类型并且根据浏览器的功能显示出不的的内容;使用VaryByHeader属性和User-Agent头根据浏览器类型缓存页面的不同版本(这个办法有个问题:不但不同类型的浏览器的User-Agent头不一样,而且通常它还包含更多信息,比如浏览器版本以及运行浏览器的计算机平台); | |||||||||||
VaryByCustom | |||||||||||
可以使用这个属性控制页面输出缓存的敏感度;还可以提供自定义的字符串; | |||||||||||
VaryByCustom="Browser":如果希望缓存时对浏览器的区分不那么细致,可以使用该属性; | |||||||||||
Location | |||||||||||
Location="Any":这是默认值。所有位置都应该缓存页面,包括服务器、下行服务器、和浏览器; | |||||||||||
Location="Client":应该只在浏览器上缓存页面的输出(浏览器缓存是否发生取决于浏览器设置); | |||||||||||
Location="Downstream":应该只在下行服务器上缓存页面的输出; | |||||||||||
Location="None":应该不进行页面缓存; | |||||||||||
Location="Server":应该只在服务器上缓存页面; | |||||||||||
HttpCachePolicy类 | |||||||||||
如果希望更精细的控制页面的缓存行为,可以直接在程序中调用这个类的方法,进行有效设置; | |||||||||||
SetExpires():指定页面过期的绝对时间; | |||||||||||
SetCacheability():指定应该如何缓存页面; | |||||||||||
SetCacheability()方法接受以下HttpCacheability枚举值之一: | |||||||||||
NoCache:用Cache-Control:no-cache头阻止任何页面缓存; | |||||||||||
Private:表示代理服务器不应该缓存页面,而浏览器可以缓存页面(默认值); | |||||||||||
Public:表示代理服务器和浏览器都可以缓存页面; | |||||||||||
Server:表示应该只在服务器缓存页面; | |||||||||||
页面分段缓存 | |||||||||||
页面分段缓存是用用户控件实现的。通过为页面每个区域创建单独的用户控件来定义页面的区域。在每个用户控件中,可以使用Output-Cache指令指出如何缓存控件的输出。 | |||||||||||
注意: | |||||||||||
1、注意分段缓存不支持Location特性;缓存页面分段惟一合法的地方是web服务器。这是因为分段缓存在ASP.NET中是新的功能,所以浏览器和代理服务器不支持。 | |||||||||||
2、分段缓存有另外一个在页面缓存中没有的特性——VaryByControl。VaryByControl特性允许指定一个由分号分隔的字符串列表,代表用户控件内使用的控件的名称;ASP.NET将针对值的每个不同的组合生成用户构件的一个缓存版本。 | |||||||||||
页面分段缓存的限制 | |||||||||||
1、如果为用户控件启用了缓存,就不能在包含它的页面中通过程序访问此控件了; | |||||||||||
例如:ctlContents.Message = "Hello!" | |||||||||||
2、不应该对缓存的用户控件使用数据绑定语法; | |||||||||||
不允许:<myControls:PageContents CategoryID='<%# CategoryID%>' Runat='Server'/> 会产生一个错误信息; | |||||||||||
允许: <myControls:PageContents CategoryID='2' Runat='Server'/> | |||||||||||
页面数据缓存 | |||||||||||
在缓存中添加对象 | |||||||||||
HttpContext.Current.Cache.Insert()方法用于覆盖ASP.NET缓存中现有的缓存项。 |
|||||||||||
HttpContext.Current.Cache.Add()方法只用于在ASP.NET缓存中添加新的缓存项(如果用它覆盖现有的缓存项,则会失败)。 |
|||||||||||
参数名称 | 含义 | ||||||||||
string | Cache键 | ||||||||||
object | 缓存的对象 | ||||||||||
System.Web.Caching.CacheDependency | 允许指定一个(或多个)文件或缓存键。如果文件发生变化,对象就被删除。如果缓存键发生变化,对象也被删除。 |
||||||||||
System.DateTime | 这是一个DataTime值,指明缓存数据过期的时间(绝对过期时间) | ||||||||||
System.TimeSpan | 这是一个时间间隔,指明缓存数据在上一次访问后可以在缓存中保留多长时间(弹性过期时间) | ||||||||||
System.Web.Caching.CacheItemPriority | 使用CacheItemPriority来指定缓存数据的优先级,以便在缓存被填满的时候删除那些优先级低的数据。 | ||||||||||
System.Web.Caching.CacheItemRemovedCallback | 当从缓存中移除对象时将调用的委托; | ||||||||||
从缓存中获取对象 | |||||||||||
(ObjectType)HttpContext.Current.Cache[KEY] | |||||||||||
在从缓存中获取对象之后应该检查此对象是否是null;如果它是null,那么需要重新将此对象赋值给缓存。 | |||||||||||
if(HttpContext.Current.Cache[USERROLEKEY] != null) { //执行获取后的操作 } else { //重新加载缓存 } |
|||||||||||
从缓存中显式地删除对象 | |||||||||||
HttpContext.Current.Cache.Remove(KEY) | |||||||||||
设置缓存文件依赖性 | |||||||||||
当你在缓存中添加一个对象时,可以将此对象与一个文件或多个文件相关联。如果文件改变了,就自动的从缓存中删除此对象; | |||||||||||
CacheDependency dep = new CacheDependency(@"C:\test.xml"); //构造参数也可以为一个文件路径数组,这样缓存与多个文件相关联 | |||||||||||
HttpContext.Current.Cache.Insert(USERROLEKEY,dsRoleDist, dep); | |||||||||||
设置缓存键依赖 | |||||||||||
使一个缓存的对象依赖于另一个或多个缓存的对象; | |||||||||||
依赖于一个缓存对象例:(VB) | |||||||||||
Cache("item2") = object; | |||||||||||
Dim arrKeyDepends() String = {"item2"}; | |||||||||||
Cache.Insert("item1", dsObject, New CacheDependency(Nothing, arrKeyDepends); | |||||||||||
依赖于多个缓存对象例:(VB) | |||||||||||
Dim arrKeyDepends() String = {"item2", "item3", "item4"}; | |||||||||||
Cache.Insert("item1", dsObject, New CacheDependency(Nothing, arrKeyDepends); | |||||||||||
注意: | |||||||||||
键依赖性是级联的;如果你建立一个键依赖性链条,那么修改链条中的一个对象会导致丢弃链条中其它对象;还可以使键依赖性形成闭环;在此情况下,修改此环中的任一对象都会导致丢弃环中的所有缓存对象; | |||||||||||
设置缓存过期策略 | |||||||||||
1、设置缓存绝对过期 | |||||||||||
DateTime dt = new DateTime(DateTime.Now.Year,12,31); Cache.Add("MembersDataSet", dsMembers, null, dt, TimeSpan.Zero, CacheItemPriority.Normal, null); |
|||||||||||
在预设的时间过后,用绝对策略插入的对象将被自动丢弃; | |||||||||||
2、设置缓存变化过期 | |||||||||||
Cache.Add("MembersDataSet", dsMembers, null, DateTime.MaxValue, TimeSpan.FromMinutes(5), CacheItemPriority.Normal, null); | |||||||||||
如果对象是用变化的过期策略缓存的,那么在对象最后一次被访问后经过设置的时间间隔之后对象被从缓存中删除; | |||||||||||
注意: | |||||||||||
不能在缓存中添加一个同时具有绝对和变化的过期策略的对象; |