原作:Smitha Vijayan
大量的网站页面是采用动态的方式,根据用户提交的不同请求创建生成页面。正如我们所知的,动态页面有助于根据用户要求来提供定制的动态内容。动态页面也利于获取在数据库中每时每刻更新的资料。缺点是为每个用户请求生成同一页面增加了系统开销。
为克服此问题,一些网站用页面生成引擎对所有页面生成html静态页面。但这样生成的页面对所有用户的请求内容都是相同。
ASP.NET 提供了缓存技术有助于我们最大程度地解决这个问题。它能缓存输出的页面,保存在存储器当中,缓存用户请求的内容。缓存的特点可以根据不方式来定制的。
为缓存一个页面输出的内容,我们要在面面顶部指定一个 @OutputCache 命令。语法如下所示:
<%@ OutputCache Duration=5 VaryByParam="None" %>
如你所见,这条指令有两个属性。他们是:
如果对同一页面的两次请求含不同的查询字串参数,如:.../PageCachingByParam.aspx?id=12 和.../PageCachingByParam.aspx?id=15 ,这应该生成不同的页面内容,指令应该是:
<%@ OutputCache Duration=10 VaryByParam="id" %>
对这样两种不同请求的页面内容每一个都会被缓存 Duration 属性指定的时间长度。。
为了指定多个参数的情形,要使用分号来分隔参数名称。如果我们指定 VaryByParam 属性为“*”,缓存内容会因传递的不同查询字串参数而不同。
一些动态页面要根据不同的浏览来生成不同的内容。在这种情况下就要规定缓存输出内容要因不同浏览器而不同。@OutputCache 命令要改为:
<%@ OutputCache Duration=5 VaryByParam="id" VaryByCustom="browser" %>
这条指令不仅让缓存输出内容因浏览器不同而不同,而且也会因浏览器版本不同而不同,如 IE5、IE 6、Netscape 4、Netscape 6 都会获得不同输出的缓存版本。
有时我们可能只是想缓存一个页面的一小部分。例如,我们可能用这样的页面,对所有浏览用户都有同样的内容,这个页面有一个标题。这个标题可能是某个文本/图象组成,并且每天数据都可能改变。在这种情况下,我们就会只想缓存这个标题一天的有效期。
解决方法是把标题内容放入一个用户控件当中,然后指定这个用户控件应该被缓存。这个技术被称为局部缓存(fragment caching)。
为了指定应该被缓存的用户控件,我们利用 @OutputCache 指令,就象整个页面缓存的用法一样。
<%@ OutputCache Duration=10 VaryByParam="None" %>
在上面的指令中,用户控件缓存有效期是 Duration 属性指定的时间(10 秒)。不论查询字串和浏览器类型/版本如何,缓存输出的内容是相同的。。
ASP.NET 也支持作为对象类型数据的缓存。我们可以把对象存储在内存中,在我们应用程序的不同动态页面中使用它们。利用 Cache 类可以实现这个特点。缓存的生存周期与应用程序的相同。对象可以以键值对(name value pairs)的形式储存于缓存当中。如下所示插入一个字串进缓存:
Cache["name"]="Smitha";
这个存储的字串值可以象这样得到:
if (Cache["name"] != null)
Label1.Text= Cache["name"].ToString();
为把对象插入缓存中,可以使用 Cache 类的 Add 方法或者不同版本的 Insert 方法。这些方法可能允许我们使用这个 Cache 类提供的更强大功能,下面是利用了 Insert 方法的一个重载:
Cache.Insert("Name", strName,
new CacheDependency(Server.MapPath("name.txt"),
DateTime.Now.AddMinutes(2), TimeSpan.Zero);
头两个参数是是键名和被插入的对象。第三个参数是 CacheDependency 类型,帮我们对名为 name.txt 文件设置值的依赖项。因此一旦这个文件发生改变,在缓存中的这个值会被删除。我们可以指定 “null” 值来表明没有依赖项。第四个参数指定了从缓存删除这个值的时间。最后一个参数是缓存过期时间可调的参数,它指明了从最后一次访问缓存时间到它被删除的时间间隔。
当可用系统内存不多时,缓存自动从内存中删除使用少的项目。这个过程被称为净化(scavenging)。我们可以为添加进缓存中的项目指定优先级,以便某些项目能得到优先处理:
Cache.Insert("Name", strName,
new CacheDependency(Server.MapPath("name.txt"),
DateTime.Now.AddMinutes(2), TimeSpan.Zero,
CacheItemPriority.High, null);
枚举类型 CacheItemPriority 给成员设置不同的优先级。CacheItemPriority.High 给项目分配了个高优先级,以使该项目减少被缓存删除的可能性。
本文中,我尽可能对 ASP.NET 的缓存技术多个可选方便提供一个总的概括。为保持本文的简短扼要没有提供详细的解释和说明。
在一个启用缓存的含子控件嵌套风格中可用局部缓存。我还没有测试如何利用这一点,因此也就没有包括这个技巧的说明。同时 Cache 类的 Insert 方法也就没有在此讨论了。我希望本文对读者而言是一个研究多姿多彩的 ASP.NET 世界的一个良好的开端。
本文样例源码下载。源代码中提供了各种缓存技术实例。使用 index.htm 页面可以看到所有例子的列表。
February 23, 2004 - first version
本文地址:http://com.8s8s.com/it/it45156.htm