介绍:
采用缓存是改善web应用程序执行能力(性能)最可靠的方法之一。缓存在一个快速可存取的位置中采用一些昂贵的操作以及存储它的结果。ASP.NET版本1.0介绍了两种口味的缓存:
1、输出缓存---缓存整个提供一个ASP.NET web页面的组成或者特定期限的用户控件。
2、数据缓存---用来在web服务器内存中存储对象的一个以编程可存取, 在内存数据高速缓存。
获得更多关于ASP.NET 1.x的缓存可兼容性的深入讨论,参考Scott McFarland的ASP.NET的缓存技术以及Steve Smith的ASP.NET 缓存:技术与最佳实践的文章。
在ASP.NET 2.0中,缓存系统已经被扩展到包括SQL cache dependencies,cache profiles,以及回调缓存(post-cache)替换输出缓存。ASP.NET快速开始的Caching for Performance的一段提供ASP.NET 2.0的缓存选项的很好地概况。这篇文章探索ASP.NET中的输出缓存,以一个输出缓存的概况和随后进行仔细审视创建页开始,该创建页包括缓存和非缓存两者的组成,使用片段缓存(fragment caching)和回调缓存(post-cache)替换技术。继续读下去可以学习得更多!
输出缓存的概况
输出缓存通过缓存提供ASP.NET web页面的组成以及服务这项内容,而不是重新绘制页面来改善ASP.NET应用程序的性能。举个例子,想象一个你拥有一个ASP.NET页面,用来显示数据库Employees表的记录,列出当前employee的信息。没有缓存,每一次该页面存取一个连接来连接数据库,表被查询,以及结果返回到请求的客户端。但是employee信息每隔多久变化呢?可能不超过每日一次或使,使得许多这些对数据库的请求多余的。有了输出缓存,当该页面第一次被访问绘制的HTML将会以特定的期限被缓存下来。在这段时间期间,如果用户请求该页面,该缓存组成会被返回,从而节省数据库访问以及页面绘制的费用。
总而言之那就是输出缓存!为了实现输出缓存,简单地添加<% @OutputCahe %>指向你的页面顶部,象这样:
<%@ Page ... %> |
duration是其中有多少秒绘制组成保留在缓存中。paramList是参数列表,其值更改缓存。举个例子,如果显示employees的页面只是显示那些在某部门的employees,通过一个querystring 参数作为决定,然后我们想通过该参数来更改缓存。为了更准确,想象一下当访问象ShowEmployees.aspx?DepartmentID=departmentID,我们employee页面显示一个某部门的employees。如果缓存不受任何参数影响的话,然后当一个用户访问ShowEmployees.aspx?DepartmentID=Sales,在sales部门的employees会被返回并且组成被缓存下来。如果一个用户在该缓存期限里面访问ShowEmployees.aspx?DepartmentID=IT,他们仍然会看到缓存销售人员而不是IT人员。
为了修正这个,我们简单地需要指示输出缓存引擎通过DepartmentID参数来更改它的缓存:
<%@ OutputCache Duration="duration" VaryByParam="DepartmentID" %> |
为了通过所有参数更改,使用一个星号(*);为了通过无参数更改,使用“None"。
输出缓存的奥秘
当输出缓存很容易实现,只是添加<%@ OutpuCache %>指向-有一些值得注意的奥妙。正如前面所讨论,适当地更改缓存是重要的,以至正确的缓存版本被服务基于输入参数的值。除了VaryByParam,还有额外的VaryByX选项应该被考虑。举个例子,你可能会通过浏览器来更改缓存,既然antequated浏览器以HTML 3.2标签被绘制。而如果你拥有一个能操多种语言的站点,你会想通过你使用何种参数来更改缓存,决定显示的语言。参考ASP.NET 缓存:技术与最佳实践的细节关于通过HTTP头或者定制的值更改缓存。
观察输出缓存的性能
输出缓存在ASP.NET中作为HTTP Module被实现的,尤其System.Web.Caching命名空间里面的OutputCacheModule类。一个HTTP Module监听引发在生命周期请求的事件以及当某一特定事件引发能够执行代码。该OutputCacheModule HTTP Module订阅ResolveRequestCache和UpdateRequestCache的事件。在ResolveRequestCache事件,该module决定如果该文件正在被请求加入输出缓存以及,如果这样的话,有一个传回的缓存版本。如果没有缓存版本的话,页面通常被绘制。在另一方面当UpdateRequestCache事件引发,该module会缓存该绘制输出(如果页面被设置来支持输出缓存)。下面的顺序图通过OutputCacheModule module简单化该任务的执行,但突出了整体工作流程。
如果你想一个页面输出缓存到期,在该特定期限到达之前,有两个选择。你可以编程的方式通过调用Response.RemoveOutputCacheItem(path)方法来为某个页面去除输出缓存内容。path是虚拟绝对路径。你也可以与该输出缓存联系外部依赖,正如在Caching Page Output with Cache Key Dependencies讨论一样。这包括为一个页面配合SQL Cache Dependencies到输出缓存的能力;查看ASP.NET2.0快速开始的SQL Cache Invalidation的一段。以其来获得更多的信息。
<%@ Control ... %> |
<%@ Page ... %> |
<asp:Substitution ID="DynamicMessage" runat="server" MethodName="GetMessage" /> |
'VB |
P.S.翻译文章引用地址:http://aspnet.4guysfromrolla.com/articles/121306-1.aspx
评论