23.2.3 高速缓存依赖性(1)

 

使用Cache对象可以根据几个不同的依赖性,来存储和禁用高速缓存中的数据项。在ASP.NET 1.0/1.1中,只有如下依赖性:

基于文件的依赖性

基于键的依赖性

基于时间的依赖性

在使用Cache对象给高速缓存插入数据项时,用Insert方法设置依赖性,如下面的示例所示:

Duration属性定义了页面在高速缓存中的保存时间(秒)。VaryByParam属性确定高速缓存页面输出的版本。根据所需要的HTTP-POST或HTTP-GET响应可以生成不同的响应。除了OutputCache指令的属性之外,ASP.NET还包含VaryByHeader、VaryByCustom、VaryByControl和Location属性。另外,Shared属性也会影响UserControl,如后面所述。

ASP.NET中的高速缓存实现为一个HttpModule,它通过ASP.NET辅助进程监听所有HttpRequest。OutputCacheModule监听应用程序的ResolveRequestCache和UpdateRequest Cache事件,处理高速缓存的请求和失败,返回高速缓存的HTML,如果需要,绕过页面处理程序。

1. VaryByParam属性

VaryByParam属性可以指定哪些QueryString参数会高速缓存页面的新版本:

Cache.Insert("DSN", connectionString, _
New CacheDependency(Server.MapPath("myconfig.xml")))<%@ OutputCache Duration="90" VaryByParam="pageId;subPageId" %>

在所引用的数据项发生变化时使用依赖性,就从内存中删除了该数据项的高速缓存。

高速缓存依赖性在ASP.NET 2.0中进行了改进,添加了AggregateCacheDependency类、可扩展的CacheDependency类,还可以创建定制的CacheDependency类。详见下面的内容。

1. AggregateCacheDependency类

AggregateCacheDependency类类似于CacheDependency类,但它可以使用不同类型的依赖性,建立与高速缓存中的数据项的关联。例如,如果XML文件中有一个高速缓存的数据项,还从SQL数据库表中获得了信息,就可以创建一个AggregateCacheDependency,其中为每个子依赖性插入一个CacheDependency对象。为此,要调用Cache.Insert,添加AggregateCacheDependency实例,如下所示:

Dim agg as new AggregateCacheDependency()
agg.Insert(New CacheDependency(Server.MapPath("myconfig.xml")))
agg.Insert(New SqlCacheDependency("Northwind", "Customers"))
Cache.Insert("DSN", connectionString, agg)

注意,要和不同类型的CacheDependency类一起使用。如果只想给一个高速缓存的数据项与多个文件建立关联,可以使用CacheDependency的一个重载版本,如下所示:

VB
Cache.Insert("DSN", yourObject, _
New System.Web.Caching.CacheDependency( _
New String() _
{ _
Server.MapPath("foo.xml"), _
Server.MapPath("bar.xml") _
} _
) _
)
C#
Cache.Insert("DSN", yourObject,
new System.Web.Caching.CacheDependency(
new string[]
{
Server.MapPath("foo.xml"),
Server.MapPath("bar.xml")
}
)
);<%@ OutputCache Duration="90" VaryByParam="*" %>

AggregateCacheDependency类支持扩展以前的密封类CacheDependency,可以使用这个新特性创建定制的CacheDependency。

2. 非密封的CacheDependency类

在ASP.NET 2.0中,高速缓存的一个重大变化是重新修订了CacheDependency类,它现在是不密封的(即可以重写)。现在可以创建继承于CacheDependency的类,建立更精细的依赖性,而不限于过去的Time、Key和File依赖性。

在创建自己的高速缓存依赖性时,可以为Web服务数据、仅用于午夜的依赖性和文件中的文本字符串变化等添加过程。我们创建的依赖性没有任何限制。CacheDependency类的非密封性允许指定高速缓存中的数据项何时需要禁用。

有了CacheDependency类的非密封性,ASP.NET小组建立了一个新的SQL Server高速缓存依赖性:SqlCacheDependency。SqlCacheDependency是ASP.NET1.0/1.1开发人员最需要的高速缓存功能。在高速缓存因底层SQL Server的表发生变化而无效时,我们会立即知道。

CacheDependency类现在不是密封的,所以可以派生出定制的CacheDependencies类,如下一节所述。

posted @ 2008-12-29 19:05  李逍遥  阅读(373)  评论(0编辑  收藏  举报