缓存管理
一、 输出缓存
输出缓存是对那些输出到客户端的整个或部分页面的缓存,它需要开发人员使用OutputCache指令或HttpCachePolicy类菜启用,不会自动发生。下面我们首先来介绍一下OutputCache指令。
如同所有的页面指令一样,OutputCache指令必须置于页面文件的顶端,如下:
OutputCache指令的完整语法为:
Duration = " ** "
VaryByParam = " ** "
CacheProfile = " ** "
DiskCacheable = " ** "
Location = " ** "
NoStore = " ** "
SqlDependency = " ** "
VaryByControl = " ** "
VaryByCustom = " ** "
VaryByHeader = " ** "
%>
- Duration
指定页面或用户控件被缓存的秒数(必须)
- VaryByParam
允许根据提交给服务器的参数缓存页面的不同版本(必须,但若已经包括VaryByControl属性,则该属性对于用户控件来说是不必需的)
该属性有两个特殊的参数值:
None:不根据参数保存不同的版本。
* :在缓存中,为每个查询字符串值或者表单标量的唯一组合保存一个页面的独立版本。注意,参数值是大小写敏感的。
- CacheProfile
若发现多个页面使用相同的OutputCache指令,则可以使用CacheProfile来重用相同的属性,可将
< add name = ”StateCityCacheProfile”
Enabled = ” true ”
Duration = ” 60 ”
VaryByParam = ”state;city” // 这里根据state和city的参数组合缓存
outputCacheProfiles >
同理,可将这个CacheProfile应用于服务器上所有页面,可将其添加到machine.config或全局的Web.config文件中。若它仅应用于某个特定的网站,可将其添加到应用程序根目录中的Web.config文件中。 在OutputCache指令中使用CacheProfile属性,如:
- DiskCacheable
如果内存容量跌到某个程度时,Asp.Net将从缓存中溢出项目,这个过程称为收集。默认情况下,Asp.Net将输出缓存保存到磁盘中。这种方式可以从磁盘活得数据而不是在缺少内存时重新生成,另外,这样缓存数据可帮助应用程序免于重新启动。
禁用磁盘缓存,设置DiskCacheable为false
- Location
该参数指定了计算机在哪里保存缓存数据,该参数允许的值包含在OutputCacheLocation枚举中, OutputCacheLocation枚举如下:
Client:缓存和客户端浏览器在同一台机器上
Downstream:缓存保存在Web服务器的下一级服务器上,即可能是代理服务器
Server:缓存保存在处理请求的Web服务器上
None:禁用输出缓存
Any:输出缓存既可保存在客户端上又可保存在一台下一级服务器或Web服务器上
注意:当用户控件使用输出缓存时,Location参数不受支持(默认类型为Any)
- NoStore
指示是否设置了 HTTP Cache-Control
- SqlDependency
该属性允许在数据改变时,使输出缓存过期。
- VaryByControl
当对用户控件缓存时,将使用该参数。该参数的值由分号分隔的字符串列表组成。每一个字符串表示用户控件的一个完整属性名。
- VaryByCustom
若这个参数值设置给浏览器,那么该参数将根据浏览器使用不同的缓存。(不同的浏览器名称和版本会有不同的缓存)
- VaryByHeader
该参数可根据Http头的不同使用不同的缓存。该参数值由分号分隔的Http头列表组成。
了解了上面的基础知识,下面我们来介绍一下如何缓存页面或页面的部分内容。
- 缓存整个页面,我们在页面的顶端首先加入:
在页面中我们添加一个Label控件,用于显示当前的时间,在页面的Page_Load事件中加入lblTime.Text = "This page was loaded at " + DateTime.Now.ToLongTimeString();然后编译运行,接着我们在页面中不断地刷新,可以看到Label控件显示的文字没有变化,大约10秒钟后才变。实际上页面的内容被缓存了10秒钟。
- 缓存部分页面内容
通常,我们通过用户控件来缓存页面的部分内容。我们将需要缓存的部分内容放在用户控件中,然后对其进行缓存。这可称为片断缓存。例子见Demo
二、对象缓存
在Asp.Net中我们可以把任何对象放入缓存中,对象可以是任何类型:类、Web控件、数据类型、DataSet等等。那我们为什么要用对象缓存呢?举个通俗的例子来说明问题吧:我们在线查询去南京的列车时刻表,返回给客户的是相对不变的车次、发车时间、公里数等等。那我们是不是应该让每次请求时都查询数据库?这样显然要消耗较多的资源且速度也相对较慢,那么我们将这些数据在第一次装载的时候放入DataSet等缓存起来,当我们要去该数据的时候可直接从高速缓存中获得,这样速度不仅快了而且占用的资源也大大减少。同时,我们还可以根据需要设置过期时间,如每小时、每天等来重新加载数据以达到更新信息的目的。我猜想博客园的博客列表排名就是用该方法。不知道是否如我所料。
对象的缓存如何实现在这里不多讲了,参见Demo的ObjectCache.aspx页面
在下一篇中将介绍Asp.Net的Cache类
这节的Demo(点击下载)