专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » asp.net缓存:ASP.NET缓存Cache策略经验谈 »正文

asp.net缓存:ASP.NET缓存Cache策略经验谈

来源: 发布时间:星期三, 2009年1月21日 浏览:5次 评论:0
="t18">整页输出缓存Cache

要提升ASP.NET应用性能最简单、最有效方式就是使用内建缓存Cache引擎虽然也能构建自己缓存Cache但由于缓存Cache引擎已提供了如此多功能所以完全不必如此麻烦在很大程度上ASP.NET开发者在Web应用能将缓存Cache引擎功能直接包装到自己数据表示及访问类中如本文所述整个过程其实非常简单

ASP.NET缓存Cache引擎支持 3种类型缓存Cache:


整页输出缓存Cache是在个页被首次请求时将整个页呈现好HTML内容缓存Cache下来后续请求将直接取用缓存Cache拷贝
部分缓存Cache是指缓存Cache部分HTML内容这类似个Web用户Control控件输出的所以叫这样个名字我们般说“将部分HTML提交给个页”
数据缓存Cache关注是单独变量或数据项缓存Cache它在比以上两种缓存Cache类型都要低个级别上工作
整页输出缓存Cache
整页输出缓存Cache是最简单缓存Cache类型它只要求为准备缓存Cache页添加个预处理指令 OutputCache使用这种缓存Cache就不必重新处理个页Init LoadPreRenderRender以及Unload事件假如那些事件要访问像数据库那样个后端系统那么节省时间将是非常可观ASP.NET可缓存Cache个页几个变体并将每个页都和后续请求相关联所有这些都由 OutputCache预处理指令来控制该命令要放在个ASPX页顶部并采用以下格式:


<%@ OutputCache Duration="#ofseconds" Location="Any | Client | Downstream | Server | None" VaryByCustom="browser | custom" VaryByHeader="headers" VaryByParam="parameter name" %>
OutputCache预处理指令最多可利用5个相关属性来控制缓存Cache行为表 A整理总结了这些属性及其含义

表A

属性 介绍说明
Duration 该属性指定了网页要缓存Cache时间(以秒为单位)通过为个页设置该属性可为来自对象HTTP响应建立个过期策略这是个必需属性如果不包括它会发生解析器注意它指定是绝对过期时间而非周期性过期
Location 用这个属性指示Web服务器和下游设备(比如代理服务器和浏览器)来缓存Cache页面内容默认为Any该属性并非必需
VaryByParam 该属性使用由分号分隔串列表来改变输出缓存Cache默认情况下这些串对应于随GET思路方法属性发送查询串值或对应于使用POST思路方法发送个参数如果将该属性设为多个参数输出缓存Cache将针对指定每个参数包含所请求文档个区别版本可能值包括None、*以及任何有效查询串或POST参数名如果没有设置其他属性该属性就是必需
VaryByCustom 对自定义输出缓存Cache需求进行表示任何文本都要包含在这个属性中如果为属性指派浏览器个值缓存Cache会根据浏览器名称及主版本信息而发生变化如果输入个自定义就必须在应用Global.asax文件中覆盖GetVaryByCustomString思路方法
VaryByHeader 该属性使用由分号分隔HTTP标头列表来改变输出缓存Cache如果属性设为多个标头输出缓存Cache将针对指定每个标头包含所请求文档个区别版本

OutputCache属性


OutputCache预处理指令可在内存中方便地创建静态页版本例如:


<%@ OutputCache Duration=“300" VaryByParam="None" %>
还可根据id查询串参数来缓存Cache多个版本例如:


<%@ OutputCache Duration=“300" VaryByParam="id" %>
在上述两个例子中网页会在5分钟(300秒)后从缓存Cache中清除该数字是由 Duration属性指定

根据自定义信息来缓存Cache


根据自定义信息来缓存Cache
使用VaryByCustom属性可根据你提供自定义信息来创建个页缓存Cache版本例如要为每种类型浏览器创建网页个区别版本可使用以下预处理指令:


<%@ OutputCache
Duration=“300"
VaryByParam="None"
VaryByCustom=“browser”%>
使用VaryByCustom还可根据应用特有信息来缓存Cache网页例如要根据当前用户部门名称来创建网页缓存Cache版本可使用以下预处理指令:


<%@ OutputCache
Duration=“300"
VaryByParam="None"
VaryByCustom=“department”%>
然后在用于Global.asax文件代码隐藏类中可覆盖GetVaryByCustomString思路方法如以下VB.NET代码所示:


Public Overrides Function GetVaryByCustomString( _
ByVal context As .Web.HttpContext, _
ByVal custom As String) As String
If custom = "department" Then
' the department for the current user
End If End Function

这里向GetVaryByCustomString思路方法传递了在预处理指令中使用自定义值ASP.NET运行库该思路方法时你可使用自己算法根据输入值来判断当前用户所在部门并从思路方法中返回它

根据标头信息来缓存Cache
使用VaryByHeader属性可根据网页接收到个或多个HTTP标头来创建个网页多个缓存Cache版本例如要想根据浏览器语言来创建和缓存Cache区别版本可使用以下预处理指令:


<%@ OutputCache
Duration="60"
VaryByParam="None"
VaryByHeader="Accept-Language" %>

-------------------------------------------------------------


检查标头
要查看随同特定Web请求发送各个HTTP标头可打开ASP.NET页跟踪功能具体做法是在网页 Page预处理指令中设置trace和traceMode属性另外也可通过Visual Studio .NET属性页来设置


-------------------------------------------------------------


除了声明性地缓存Cache整个网页还可使用由Page类揭示Response对象 Cache属性来化地设置个页缓存Cache选项Cache属性揭示了用于网页 HttpCachePolicy对象可用它在服务器上将缓存Cache时间设为5分钟如以下C# 代码段所示:


private void Page_Init( object sender, .EventArgs e ) { Response.Cache.SetCacheability(HttpCacheability.Server); Response.Cache.SetExpires(DateTime.Now.AddSeconds(300)); Response.Cache.SetValidUntilExpires(True) }
部分缓存Cache


部分缓存Cache
部分缓存Cache允许只缓存Cache部分HTML效率很高个页中经常变化部分可和那些不经常变化部分部分合并到同时仍能从缓存Cache中检索静态部分个例子是将“部分缓存Cache”应用于需要XML Web服务Web用户Control控件这样可获得很高效率它避免了你网站WebSite和Web服务过度紧密地耦合同时还能显著提升性能

要使用部分缓存Cache同样可在HTML页顶部放置条OutputCache预处理指令但这我们准备把它放到Web用户Control控件ASCX页中注意使用部分缓存Cache时 Location和VaryByHeader属性将不再支持但新增了对VaryByControl属性支持

使用VaryByControl属性可用个由分号分隔列表来指定用户Control控件个或多个属性可为属性值种组合来创建缓存Cache版本例如假定你用户Control控件揭示出个自定义 State属性它控制着要显示用户Control控件哪些元素使用以下预处理指令可针对 State每个值来缓存CacheControl控件所具体呈现个版本:

<%@ OutputCache Duration="300" VaryByControl="State" %>
但在缓存CacheWeb用户Control控件时记住ASP.NET运行库会直接用缓存CacheHTML来替换实际Control控件忽略平常会发生任何Control控件处理这暗示着在网页中执行代码不能化地操纵个缓存Cache用户Control控件或者它任何属性换言的Web用户Control控件必须能完全自主并能通过它 Load和Init事件来化自己以便有效地缓存Cache

也可声明性地完成部分缓存Cache思路方法是使用个属性而不是使用OutputCache预处理指令在代码隐藏文件中 PartialCaching属性可放在从UserControl派生个类中使ASP.NET运行库能够读取它并相应地缓存Cache呈现好HTML例如以下来自代码隐藏类声明能根据查询串中 id值将Web用户Control控件缓存Cache5分钟


<PartialCaching(300, "id", Nothing, Nothing)> _ Public MustInherit Class MyHeaderControl Inherits .Web.UI.UserControl
数据缓存Cache


数据缓存Cache
ASP.NET缓存Cache引擎支持最后种缓存Cache类型是“数据缓存Cache”根据定义工作级别要低于整页输出缓存Cache和部分缓存Cache假如几个网页都要使用相同数据(例如个产品列表)但要以区别方式来显示这些数据就可考虑使用这种缓存Cache当然数据缓存Cache的所以具有性能优势减少了对后端数据库次数

为了在缓存Cache中添加个项需使用Page或UserControl类Cache属性这两个类最终都是从Control类派生 Cache属性揭示出了.Web.Caching.Cache对象利用它可将数据当作键和值个组合来存储使用该属性开发者可编写代码来填充个项并把它放到缓存Cache中;如果该项已经存在就直接将其从缓存Cache中取出如以下C#代码所示

DataTable dt = null; (this.Cache["Products"] null) { // Go get the data from the database this.Cache.Insert("Products", dt, null, _ DateTime.Now.AddHours(6), TimeSpan.Zero); } { dt = this.Cache["Products"] As DataTable; }
上例首先检查具有Products键项是否在缓存Cache中如果不在就从后端数据库检索个ADO.NET DataTable并使用Insert思路方法把它放到缓存Cache中本例使用是 Insert个重载版本它允许为缓存Cache对象指定个绝对过期时间(6小时)而不是指定个周期性过期相反如果缓存Cache中已经有这个项就将其取回并使用 As表达式将其强制转换回个DataTable

对ADO.NET检索到数据进行缓存Cache时注意既可像上例那样缓存CacheDataTable对象也可缓存Cache整个 DataSet对象两种对象都同任何数据源完全地断开不会保持数据库连接对数据读取器(比如 SqlDataReader)进行缓存Cache似乎更好它们只使用次(它们是“只进”读取器)而且在打开情况下将直占据个数据库连接

ASP.NET缓存Cache引擎强大灵活性和功能使其成为创建高性能ASP.NET应用时最重要特性的根据本文提供基本信息你可在自己应用轻松引入缓存Cache引擎功能

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: