ASP.NET的Caching
1. 要使用一个页面的缓存,就在页面的开头加上@OutputCache标志
<%@ OutputCache Duration=5 VaryByParam="None" %>
OutputCache的两个属性:
Duration:缓存过期的秒数
VaryByParam:这个参数是必须的。声明引起缓存变化的querystring名称
在上面的例子中,VaryByParam 被设置为None,表示无论在querystring传递的参数如何,网页的内容都是一样的
2.如果有两个具有不同的querystring参数的访问同一个页面的两个请求(比如:.../PageCachingByParam.aspx?id=12 和 .../PageCachingByParam.aspx?id=15),想让这两个请求产生不同的内容给浏览者,,需要用下面的形式:
<%@ OutputCache Duration=5 VaryByParam="id" %>
针对两个请求的页面内容将会缓存Duration属性所指定的时间
3.如果要指定多个参数,用分号分隔.如果将VaryByParam 属性设置为*,通过querystring传递的所有参数都将引起缓存内容的改变.
4. 有些网页需要根据不同的浏览器产生不同的内容,@OutputCache 就要设置成这样:
<%@ OutputCache Duration=5 VaryByParam="id" VaryByCustom="browser" %>
那么引起缓存变化的不仅是不同的浏览器,还有浏览器的主要版本号,比如IE5, IE 6, Netscape 4, Netscape 6 都会产生不同的缓存输出
5. 有时我们只需要缓存网页的一部份,比如文件头对所有用户都是一样的.又比如网页的头部每天更新,那么我们只需要把头部设置一个一天就过期的缓存.怎么办?
[解决方案] 把网页头部的内容放在一个用户控件中,然后设置这个用户控件的缓存属性.
设置用户控件的缓存和设置一个页面的缓存一样,在页面的头部加入类似下面的标示:
<%@ OutputCache Duration=10 VaryByParam="None" %>
用了上面的代码,用户控件的内容将会被缓存10秒,querystring参数和浏览器的不同都不会引起用户控件缓存内容的变化
当然,你也可以用嵌套的用户控件来实现更细致的页面局部缓存
6.ASP.NET支持将数据作为对象缓存起来,这样我们就可以跨页面使用这些数据.要实现这一点需要用到Cache类.这样产生的cache的生命周期和当前Application的生存周期是一样的.数据被用 名称-值 对的形式被缓存起来.比如,一个string类型的值可以用下面的形式放在缓存里:
Cache["name"]="Smitha";
缓存的数据用下面的方式取出来:
if (Cache["name"] != null)
Label1.Text= Cache["name"].ToString();
7.要把对象放在缓存中,可以用Cache类的Add方法,或者被几次重载的Insert方法来实现.这些方法可以让你使用Cache类提供的更强大的特性,一个Cache.Insert方法的重载形式的应用例子如下:
Cache.Insert("Name", strName,
new CacheDependency(Server.MapPath("name.txt"),
DateTime.Now.AddMinutes(2), TimeSpan.Zero);
前两个参数是key和要插入的object, 第三个参数是CacheDependency 类型的,帮助你建立一个与文件name.txt的关联.当这个文件改变的时候,该缓存就会被移除.我们可以指定null来表示没有依赖.第4个参数指定缓存将被移除的时间.最后一个参数是一个滑动的过期时间,指定自该缓存最后一次被访问时起多长时间,该缓存将会被移除.
当系统内存变低的时候,缓存将会自动从内存中移除使用最少的项,这个过程被称为scavenging(净化),我们可以给缓存中的项指定优先级,以便某些项比其他项有更高的优先级.
Cache.Insert("Name", strName,
new CacheDependency(Server.MapPath("name.txt"),
DateTime.Now.AddMinutes(2), TimeSpan.Zero,
CacheItemPriority.High, null);
CacheItemPriority枚举中具有设定不同优先级的成员,如果一个缓存项被赋予了CacheItemPriority.High优先级,那么这个缓存项从内存中被移出的可能性最小.
8.需要注意的问题:
1. 如果你的站点中有旧的ASP页面,在里面用Response.Expires 属性设置了页面的缓存输出,那么它们能够保存Response.Expires属性设置的时间,ASP.NET也支持这个属性.
2. Cache类的Insert方法将会覆盖掉已经存在的具有相同key的项.
3.CacheItemPriority.NotRemovable 优先级值可以被用在Cache.Insert方法中来设置一个缓存项的优先级,保证这个缓存项在scavenging(净化)期间不会被移除