数据缓存技术
数据缓存
缓存是一种在计算机中广泛用来提高性能的技术
在Web应用程序的上下文中,缓存用于在Http请求间保留页或者数据,并在无需新创建的情况下多次使用它们
目的:节省应用程序处理时间和资源
页面输出缓存
页面输出缓存作为最简单的缓存形式,将已经生成的动/静态页面全部内容保存在服务器内存中。
设置页面输出缓存可以使用两种方式:
- (1)@OutputCache指令
- (2)页面输出缓存 API——HttpCachePolicy类
@OutputCache指令
启用页面缓存机制的方法非常简单,只需要在页面的顶部添加一个@OutputCache指令,就可以非常容易的将缓存页面输出。
例如,将页面输出以最长60秒时间进行缓存:
<%@ OutputCache Duration="60" VaryByParam="none"%>
Duration:缓存的时间
VaryByParam:改变所要缓存输出的形参
@OutputCache指令的常用属性
HttpCachePolicy类
页面缓存API的HttpCachePolicy类的使用方法:
public partial class HttpCachePolicy类 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//页面输出缓存时间是30秒
Response.Cache.SetExpires(DateTime.Now.AddSeconds(30));
//缓存过期的绝对时间是当日下午7点整
Response.Cache.SetExpires(DateTime.Parse("19:00:00"));
//设置页面缓存级别
Response.Cache.SetCacheability(HttpCacheability.Public);
}
}
页面部分缓存
实现页面部分缓存有两种机制:一种是将页面中需要缓存的部分置于用户控件(.ascs 文件)中,并且为用户控件设置缓存功能,这就是“控件缓存”。另一种是将页面中的某一部分设置为不缓存,这就是“缓存后替换”。
控件缓存
利用@OutputCache指令设置控件缓存的常见写法:
<%@OutputCache Duration="60" VaryByParam="Id;CategoryId"%>
<%@OutputCache Duration="60" VaryByParam="none" VaryByControl="ddlGood"%>
缓存后替换

使用Substitution时,首先将整个页面缓存起来,然后将页面中需要动态改变内容的地方用Substitution控件代替即可。Substitution控件需要设置一个重要属性MethodName,该属性用于获取或者设置当Substitution控件执行时为回调而调用的方法名称。该方法必须要符合三点:
(1)该方法必须被定义为静态方法。
(2)该方法必须接受HttpContext类型的参数
(3)该方法必须返回String类型的值
应用程序数据缓存
应用程序数据缓存的主要功能是在内存中存储各种与应用程序相关的对象。通常这些对象都需要耗费大量的服务器资源才能创建。因此,对这些对象实施缓存,无论是对服务器还是对用户都有着明显的好处。
Cache类
下面是一个简单的对货品编号值,实现缓存的代码:
Cache["CategotyId"]=Request.QueryString["CategotyId"];
Cache类的主要方法
添加=》获取=》删除
Add方法
public Object Add(string key,
Object value,
CacheDependency dependencies,
DateTime absoluteExpiration,
TimeSpan slidingExpiration,
CacheItemPriority priority,
CacheItemRemovedCallback onRemoveCallback)
key:用于引用该项的缓存键。
Value:要添加到缓存的项。
absoluteExpiration:所添加对象将过期并被从缓存中移除。如果使用可调过期,则absoluteExpiration参数必须为NoAbsoluteExpiration。
Insert方法
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);
检索应用程序缓存对象
从缓存中检索应用程序数据缓存对象,通常可以使用两种方法。
(1)指定键名。
(2)使用Cache类的Get方法。
缓存依赖

CacheDependency类

实现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"%>
聚合缓存依赖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);