ASP.NET学习笔记--缓存技术

 

缓存技术

一、页面缓存
整页缓存
概念:整页缓存是最简单的缓存形式,页是常用的缓存形式。它将整个页面进行缓存。
语法:
<%@ OutputCache Duration="60" VaryByParam="id" VaryByCustom="browser" %>
应用情况
不需要频繁更新数据的页面   占用大量时间和资源才能

整页缓存的主要属性

Duration

必需属性。页面应该被缓存的时间,以秒为单位。必须是正整数。

Location

指定应该对输出进行缓存的位置。
如果要指定该参数,则必须是下列选项之一:
Any——
默认值。意味着页面的输出可以缓存在客户端浏览器,缓存在任何下游的客户端(如代理服务器),或缓存在Web服务器本身
Client——
指明输出缓存只能存储在发出请求的客户端(即浏览器)的本地缓存中
Downstream——
指明输出缓存能存储在任何支持HTTP1.1缓存的设备(如代理服务器)中
None——
指明该页面禁用输出缓存
Server(ServerAndClient)——
指明输出缓存将存储在Web服务器上

VaryByParam

该属性是以分号分隔的字符串变量,以其中每一个变量作为参数传递的页都将被作为缓存处理。"none"表示不随任何参数变化,"*" 根据所有参数变化
注意:如果没有VaryByControl,该属性是必需的

VaryByControl

该属性是以分号分隔的字符串变量,用来该变用户控件的输出缓存,这些字符串代表用户控件中声明的服务器控件ID
注意:如果没有VaryByParam,该属性是必需的

VaryByCustom

用于自定义输出缓存要求,他允许在global.asax中指定自定义变动,如果该属性值是browser,则缓存将随浏览器名称和主要信息版本信息的不同而异

VaryByHeader

基于指定的标头中的变动改变缓存条目。

示例:
在页面代码的指令区添加如下代码
<%@ OutputCache Duration="60" VaryByParam="id" VaryByCustom="browser" %>
说明:VaryByParam属性的id只从上一个页面请求时的参数Response.Rediect("User.aspx?id="+id);

页面部分缓存(缓存后替换)
概念:所谓缓存后替换就是将整个页面缓存,然后替换页面中不需要缓存的部分
实现控件——Subsitutioin控件
1
、添加整页缓存指令
<%@ OutputCache Duration="120" VaryByParam="none" %>
2
、在不需要缓存的部分添加Subsitution控件
<asp:Subsitution ID="Subsitution1" runat="server" MethodName="GetNum" />
3
、在后置代码中编写Subsitutioin控件的MethodName属性方法
protected static string GetNum(HttpContext context){
DataTable dt = GetTicketsDataTable(3);   return dt.Rows[0]["num"].ToString();}
注意:
Subsitutioin
控件 MethodName属性所调用的方法必需满足三个条件
(1)
必需是静态(static)方法(2)返回类型必需是string(3)参数类型必需是HttpContext类型
二、数据缓存(应用程序缓存)
概念:应用程序缓存是用来存储与应用程序相关的对象,主要是由Cache类来实现的。
命名控件
using System.Web.Caching;
添加缓存
1
、指定键和值
   Cache["key"] = "value";
这种方法添加缓存最方便,但是如果需要设置缓存的有效期、依赖项等特性,它就变得无能为力了
2
、使用Add()方法——只用于在ASP.NET缓存中添加新的缓存项(如果用它覆盖现有的缓存项,则会失败)
   Cache.Add("key","value",CacheDependency,DateTime,TimeSpan,CacheItemPriority,CacheItemRemovedCallbac);
  
这种方法适用于需要设置缓存的有效期、依赖项等特性的缓存,但是要注意它的7个参数必须写完整才能生效,所以灵活性不够好。
  
参数说明:
  
第一个参数:key——表示引用缓存对象的键()
  
第二个参数:value——表示要缓存的对象()
  
第三个参数:CacheDependency——表示添加依赖项(允许指定一个文件或缓存键。如果文件发生变化,对象就被删除。如果缓存键发生变化,对象也被删除)
  
第四个参数:DateTime——表示绝对过期时间(指明缓存数据过期的时间)
  
第五个参数:TimeSpan——表示可调过期时间又叫弹性的过期时间。指明缓存数据在上一次访问后可以在缓存中保留多长时间(也就是说在相对过期时间内,以相对过期时间剩余时间点为起点再进行相对过期时间。TimeSpan.Zero表示没有指定可调过期时间)()
  
第六个参数:CacheItemPriority——表示优先级,当在缓存被填满的时候删除那些优先级低的数据
  
第七个参数:CacheItemRemovedCallbac——表示回调自定义的方法(示例:可以在缓存项从缓存中删除时要求通知),它的类型是CacheItemRemovedCallback类型的
  
  
示例一:(指定一个5分钟绝对过期时间)
         Cache.Add("key","value",null,DateTime.Now.AddMinutes(5),TimeSpan.Zero,CacheItemPriority.Normal,null);   //
创建一个指定5分钟绝对过期时间的缓存
  
  
示例二:(指定一个5分钟的弹性过期时间,没有指定绝对过期时间)
       Cache.Add("key","value",null,DateTime.MaxValue,TimeSpan.FromMinutes(5),CacheItemPriority.Normal,null);    //
创建一个指定5分钟弹性过期时间的缓存
  
示例三:(过期时间也取决于一个文件的修改)
  //
过期时间取决于test.xml文件修改。也就是说当test.xml文件内容修改时此缓存就会过期
     CacheDependency dependency = new CacheDependency("C:\\test.xml");
     //
创建一个依赖文件修改而过期的缓存
     Cache.Add("key","value",dependency,DateTime.MaxValue,TimeSpan.FromMinutes(5),CacheItemPriority.Normal,null);
  
示例四:(过期时间取决于缓存中另一项的修改)
         Cache.Add("key1","value",null,DateTime.MaxValue,TimeSpan.Zero,CacheItemPriority.Normal,null); //
当缓存key1的值修改时,缓存key2就会过期
     //
添加爱到数组中
     String[] dependencyKeys = new String[1];
     dependencyKeys[0] = "key1";
     CacheDependency dependency = new CacheDependency(null, dependencyKeys);
     //
创建一个依赖另一个缓存修改而过期的缓存
     Cache.Add("key2","value",dependency,DateTime.MaxValue,TimeSpan.Zero,CacheItemPriority.Normal,null);
    
示例五:(缓存过期后回调方法)
     public void ItemRemovedCallback(String key, Object value, CacheItemRemovedReason reason){} //
缓存过期将要调用的方法
     //
创建一个当指定5分钟的弹性过期时间后调用ItemRemovedCallback方法的缓存
     Cache.Add("key","value",null,DateTime.MaxValue,TimeSpan.FromMinutes(5),CacheItemPriority.Normal,new CacheItemRemovedCallback(this.ItemRemovedCallback));

优先级值顺序

含义

High

设为此优先级的缓存项是最不可能在内存不足时被删除的

AboveNormal

设为此优先级的缓存项比优先级为Normal或以下的缓存项更优先保留

Normal

设为此优先级的缓存项比优先级为BelowNormalLow的缓存项更优先保留

BelowNormal

这是倒数第二级的优先级;设为此优先级的缓存项只比优先级设为Low的缓存项更优先保留

Low

设为此优先级的缓存项是最有可能在内存不足时被删除的

Default

缓存项的优先级的默认值是Normal

NotRemovable

当缓存项设为此优先级时,是在告诉ASP.NET即使是内存不足,也不要从缓存中删除它

3、使用Insert()方法——用于覆盖ASP.NET缓存中现有的缓存项。   这种方法可以实现多种方式的方法重载,使用起来比较灵活(但主要用法和Cache.Add用法差不错)

Cache.Insert("key","value");


    
示例一:(键值添加)
       Cache.Insert("key1","value1");
      
示例二:(添加依赖项的缓存)
   Cache.Insert("key","value",System.Web.Caching.CacheDependecy(null,dependencies));
      
示例三:(添加有效过期时间的)
       Cache.Insert("key","value",DateTime.Now.AddMinutes(1d),System.Web.Caching.Cache.NoSlidingExpiration);
  
示例四:(添加优先级的缓存)
     Cache.Insert("key","value",null,System.Web.Caching.Cache.NoSlidingExpiration,System.Web.Caching.Cache.NoSlidingExpiration,System.Web.Caching.CacheItemPriority.High,null);
4
、检索缓存
    if (Cache["key"] != null)
    {    //
处理语句 }
5
、移除缓存
   (1)
自动移除
     
出现缓存已满、或过期、依赖项更改等情况时,缓存项就会自动移除
   (2)
显示移除
      Cache.Remove("key");

三、禁止使用缓存
1
、客户端取消
   <html>    <head>
     <meta http-equiv="Expires" CONTENT="0">
     <meta http-equiv="Cache-Control" CONTENT="no-cache">
     <meta http-equiv="Pragma" CONTENT="no-cache">
   </head> <body> </body>   </html>
2
、服务器具端取消
   Response.Buffer = true;
   Response.ExpiresAbsolute = DateTime.Now.AddDays(-1);
   Response.Cache.SetExpires(DateTime.Now.AddDays(-1));
   Response.Expires = 0;
   Response.CacheControl = "no-cache";
   Response.Cache.SetNoStore();
3
Global里面: 
   protected void Application_BeginRequest(Object sender,EventArgs e)     { 
        HttpContext.Current.Response.Cache.SetNoStore();     }
     <%@ OutPutCache Location="None"%> //
禁止后退
  
说明:Global 申请全局变量,一般定义在模块中,不可在程序文件中定义
         public
可以在模块中定义,也可在程序文件中定义。
4
、页面基类:
   public class PageBase : Page   { 
       public PageBase(){} 
       protected override OnLoad(EventArgs e )     { 
          Response.Cache.SetNoStore(); 
          base.OnLoad(); 
       }     }
5
、最简单的办法 :URL后面随机的加一些没用的参数(IE是用过URL来控制缓存的,这样就解决了)
  
示例:http://xxx/xxx/xxx.jsp?p=xxx

posted @ 2010-01-30 14:10  枫叶蓝916  阅读(1137)  评论(0编辑  收藏  举报