第五章 数据缓存
1.页面输出缓存
页面输出缓存作为最简单的缓存形式,将已经生成的动/静态页面全部内容保存在服务器内存中。
设置页面输出缓存可以使用两种方式:
(1)@OutputCache指令
(2)页面输出缓存 API——HttpCachePolicy类
1.1@OutputCache指令
启用页面缓存机制的方法非常简单,只需要在页面的顶部添加一个@OutputCache指令,就可以非常容易的将缓存页面输出。
例如,下面的语句将页面输出以最长60秒时间进行缓存:
<%@ OutputCache Duration="60" VaryByParam="none"%>
Duration:缓存的时间
VaryByParam:改变所要缓存输出的形参
@OutputCache指令的常用属性
属性 | 适用对象 | 描述 |
Duration | 页面和用户控件 | 页面或用户控件的缓存时间(单位:秒) |
Location | 页面 | 为存储页面的输出制定一个有效的位置 |
Shared | 用户控件 | 一个布尔值,确定用户控件输出是否可以由多个页共享。默认值为false |
SqlDependency | 页面和用户控件 | 表示一个给定SQL Server数据库中某个指定的依赖对象。只要修改该表的内容,就将从缓存中删除页面输出 |
VaryByControl | 用户控件 | 一个由分号分隔的字符串列表,用于更改用户控件的输出缓存。这些字符串代表用户控件中声明的ASP.NET服务器控件的ID属性值 |
VaryByCustom | 页面和用户控件 | 表示自定义输出缓存要求任意文本。如果赋予该属性值为browser,缓存将随浏览器名称和主要版本信息的不用而异 |
VaryByParam | 页面和用户控件 | 分号分隔的字符串列表,用于使输出缓存发生 |
1.2HttpCachePolicy类
下面代码说明了页面缓存API的HttpCachePolicy类的使用方法:
Response.Cache.SetExpires(DataTime.Now.AddSeconds(30));
//相对时间
Response.Cache.SetExpires(DataTime.Parse("19:00:00"));
//绝对时间
2.页面部分缓存
实现页面部分缓存有两种机制:一种是将页面中需要缓存的部分置于用户控件(.ascs 文件)中,并且为用户控件设置缓存功能,这就是“控件缓存”。另一种是将页面中的某一部分设置为不缓存,这就是“缓存后替换”。2.1控件缓存
利用@OutputCache指令设置控件缓存的常见写法:
<%@OutputCache Duration="60" VaryByParam="Id;CategoryId"%>
<%@OutputCache Duration="60" VaryByParam="none" VaryByControl="ddlGood"%>
2.2缓存后替换
使用Substitution时,首先将整个页面缓存起来,然后将页面中需要动态改变内容的地方用Substitution控件代替即可。Substitution控件需要设置一个重要属性MethodName,该属性用于获取或者设置当Substitution控件执行时为回调而调用的方法名称。该方法必须要符合三点:
(1)该方法必须被定义为静态方法。
(2)该方法必须接受HttpContext类型的参数
(3)该方法必须返回String类型的值
3.应用程序数据缓存
应用程序数据缓存的主要功能是在内存中存储各种与应用程序相关的对象。通常这些对象都需要耗费大量的服务器资源才能创建。因此,对这些对象实施缓存,无论是对服务器还是对用户都有着明显的好处。
3.1Cache类
下面是一个简单的对货品编号值,实现缓存的代码:
Cache["CategotyId"]=Request.QueryString["CategotyId"];
Cache类的主要方法
方法 | 描述 |
Add | 将指定项添加到Cache对象,该对象具有依赖项,过期和优先级策略以及一个委托(可用于在从Cache移除插入项时通知应用程序) |
Insert | 向Cache对象插入项。使用此方法的某一版本改写具有相同key参数的现有Cache项 |
Remove | 从应用程序的Cache对象移除指定项 |
3.2Add方法
public Object Add(string key,
Object value,
CacheDependency dependencies,
DateTime absoluteExpiration,
TimeSpan slidingExpiration,
CacheItemPriority priority,
CacheItemRemovedCallback onRemoveCallback)
key:用于引用该项的缓存键。
Value:要添加到缓存的项。
absoluteExpiration:所添加对象将过期并被从缓存中移除。如果使用可调过期,则absoluteExpiration参数必须为NoAbsoluteExpiration。
3.3Insert方法
Insert(String,Object)
Insert(String,Object,CacheDependency)
Insert(String,object,CacheDependency,DateTime,TimeSpan)
Insert(String,Object,CacheDependency,DateTime,TimeSpan,CacheItemPriority,CacheItemRemovedCallback)
使用Add方法时必须提供7个参数,而使用Insert方法则可根据需要随意选取重载方式。
下面列举Insert方法的常用示例:
//代码示例将有一分钟绝对过期时间的项添加到缓存中
Cache.Insert("CacheItem6","Cached Item6",null,DateTime.Now.AddMinutes(1d),
System.Web.Caching.Cache.NoSlidingExpiration);
3.4检索应用程序缓存对象
从缓存中检索应用程序数据缓存对象,通常可以使用两种方法。
(1)指定键名。
(2)使用Cache类的Get方法。
4.缓存依赖
4.1CacheDependency类
4.2实现SQL数据缓存依赖
public SqlCacheDependency(SqlCommand sqlcmd);
public SqlCacheDependency(string databaseEntryName,string tableName);
(1)必须定义完全限定的表名,包括表所有者的名称,如dbo.Users。
(2)必须在select语名中显示指定列名。不能使用星号(*)通配符来选择表中的所有列。
(3)不能在查询语句中使用聚合函数。
(4)必须为当前数据库启动SQL Server Service Broker。
启用页面输出缓存,添加@OutputCache指令:
<%@OutputCache Duration="100" SqlDependency="CommandNotification" VaryByParam="none"%>
4.3聚合缓存依赖AggregateCacheDependency类
//自定义文件缓存依赖
CacheDependency dep1=new CacheDependency(fileName);
//创建SQL数据缓存依赖,cmd是一个SqlCommand实例
SqlCacheDependency dep2=new SqlCacheDependency(cmd);
//添加到CacheDeoendency对象组中
CacheDependency[]deps=new CacheDependency[]{dep1,dep2};
//调用Add方法,实现聚合缓存依赖
AggregateCacheDependency aggDep=new AggergateCacheDependency();
aggDep.Add(deps);
//调用Insert方法,添加应用程序缓存对象
Cache.Insert("key",DateTime.Now,aggDep);