`

ASP.NET的输出缓存OutputCacheVaryByParam

阅读更多

转 http://blog.csdn.net/ITFLY8/archive/2007/07/20/1700376.aspx
ASP.NET的输出缓存
衡量高性能、可缩放的web应用程序最重要的一个指标就是缓存了。ASP.NET提供了高性能的web应用程序的缓存功能,ASP.NET有三种可由Web应用程序使用的缓存:
·输出缓存,它缓存请求所生成的动态响应。
·片断缓存,它缓存请求所生成的响应的各部分。
·数据缓存,它以编程方式缓存任意对象。为支持这种缓存,ASP.NET提供了全功能的缓存引擎,使程序员能够轻松地在请求间保留数据。
页的输出缓存是非常有用的。在海量的访问站点中,有些页面的访问频率占了非常大的比重,即使对这些页使用输出缓存很少的时间,也会减轻系统不少的负担,因为后面对这些页面的请求将不在执行创建该页的代码。
但是,这样显得不够灵活,页的请求可能的确是很多,然而在页面上我们缓存了所有的东西,无论是构造成本高还是构造成本低的部分。能否有一种可以缓存页的部分的数据呢?幸运的是ASP.NET提供了针对每个请求来创建或自定义该页的各部分。比如说我们可以对页面上构造成本很高的用户控件做片断缓存。
ASP.NET缓存支持文件和缓存键依赖项,使开发人员可以使缓存项依赖于外部文件或其他缓存项。此项技术可用于在项的基础数据源发生更改时使该项无效。ASP.NET可以将这些项存储在Web服务器上或请求流中的其他软件上,例如代理服务器或浏览器。这可以使您避免重新创建满足先前请求的信息,特别是当在服务器上创建时要求大量处理器时间或其他资源的信息。
Petshop的页缓存设置
我们可以可通过使用低级别的OutputCacheAPI或高级别的@ OutputCache指令来实现页的输出缓存。启用输出缓存后,当发出对页的第一个GET请求时创建一个输出缓存项。随后的GETHEAD请求由该输出缓存项服务,直到该缓存请求过期。输出缓存还支持缓存的GETPOST名称/值对的变体。
输出缓存遵循页的过期和有效性策略。如果某页位于输出缓存中,并且有一个过期策略标记指示该页自缓存起60分钟后过期,则在60分钟后将该页从输出缓存中移除。如果此后接收到另一个请求,则执行页代码,并且可以再次缓存该页。
下面的指令在响应时激活输出缓存:
<%@ OutputCache Duration="60" VaryByParam="none"%>
DurationVaryByParam是必选参数,前者标识过期时间,后者表示GETPOST名称/值对的字符串。如果不使用该属性,可是设置为none。在这里我们还要说明一个参数VaryByCustom,使用这个参数,我们可以自定义输出缓存要求的任意文本。除了在OutputCache指令里面申明该属性之外,我们还得在应用程序的global.asax文件的代码声明块中,重写GetVaryByCustomString方法来为自定义字符串指定输出缓存的行为。
举一列来说:
<%@ OutputCache VaryByParam="none" VaryByCustom="CategoryPageKey" Location="server" Duration="43200" %>
这里的VaryByCustom定义的为CategoryPageKey,那么在global.asax里面我们必须定义CategoryPageKey这个字符创输出缓存的行为,见下面代码。
publicoverridestringGetVaryByCustomString(HttpContext context, String arg) {
stringcacheKey = "";
switch(arg) {
case"CategoryPageKey":
if(Request.IsAuthenticated ==true) {
cacheKey = "QQQ" + context.Request.QueryString["category_id"] + context.Request.QueryString["requestedPage"];
}
else{
cacheKey = "AAA" + context.Request.QueryString["category_id"] + context.Request.QueryString["requestedPage"];
}
break;
case"SearchPageKey" :
if(Request.IsAuthenticated ==true) {
cacheKey = "QQQ" + context.Request.QueryString["search_text"] + context.Request.QueryString["requestedPage"];
}
else{
cacheKey = "AAA" + context.Request.QueryString["search_text"] + context.Request.QueryString["requestedPage"];
}
break;
case"ProductPageKey" :
if(Request.IsAuthenticated ==true) {
cacheKey = "QQQ" + context.Request.QueryString["name"] + context.Request.QueryString["product_id"] + context.Request.QueryString["requestedPage"];
}
else{
cacheKey = "AAA" + context.Request.QueryString["name"] + context.Request.QueryString["product_id"] + context.Request.QueryString["requestedPage"];
}
break;
case"ProductDetailsPageKey" :
if(Request.IsAuthenticated ==true) {
cacheKey = "QQQ" + context.Request.QueryString["item_id"] + context.Request.QueryString["requestedPage"];
}
else{
cacheKey = "AAA" + context.Request.QueryString["item_id"] + context.Request.QueryString["requestedPage"];
}
break;
case"UserID" :
if(Request.IsAuthenticated ==true) {
cacheKey = "UserID_In";
}
else{
cacheKey = "UserID_Out";
}
break;
}
returncacheKey;
}
从上面对CategoryPageKey字符创所作的行为来看,当我们的请求页面中含有对特定的category_id的某一分页显示的数据页的请求时,将调用缓存(自然是已经缓存了该页)。
下表列出了petshop的web应用程序的输出缓存设置。
ASP.NET WebForms
Cache setting
Duration
ControlHeader
<%@ OutputCache
Duration="43200"
VaryByParam="none"
VaryByCustom="UserID" %>
12 hours
Default
<%@ OutputCache
Duration="43200"
VaryByParam="none"
VaryByCustom="UserID" %>
12 hours
Help
<%@ OutputCache
Duration="43200"
VaryByParam="none"
VaryByCustom="UserID" %>
12 hours
Category
<%@ OutputCache
Duration="43200"
VaryByParam="none"
VaryByCustom="CategoryPageKey " %>
12 hours
Product
<%@ OutputCache
Duration="43200"
VaryByParam="none"
VaryByCustom="ProductPageKey " %>
12 hours
ProductDetails
<%@ OutputCache
Duration="43200"
VaryByParam="none"
VaryByCustom="ProductDetailsPageKey " %>
12 hours
Search
<%@ OutputCache
Duration="43200"
VaryByParam="none"
VaryByCustom="SearchPageKey " %>
12 hours
显然petshopweb页面上部的ControlHeader是随着用户登陆的状态有关的,故其设置了VaryByCustom属性以来标识用户不同登陆状态的缓存版本。而Category页面由于可能被大量的访问,并且数据量很大,是十分有必要缓存的,但是由于数据的随机性很大,存在不同的版本,比如说是不同类别的Category,甚至不同的分页显示的数据页,在这里采用了VaryByCustom属性以缓存不同版本的页。
Petshop片断缓存
在前面我们提到ASP.NET可以提供页的局部数据的缓存,通常是一些构造代价较大的部分,诸如用户控件。在petshop里面,大量使用了用户控件(尤其是.NET示例程序Duwamish7.0使用了更多的用户控件,那些页面简直就是控件的拼装),用户控件的缓存设置方法和aspx页的缓存设置方法基本相同,在这里我们不再列出。只有ControlHeader控件使用了缓存设置,见上表。
声明的方式控制 ASP.NET 页或页中包含的用户控件的输出缓存策略。有关输出缓存的更多信息,请参见 ASP.NET 缓存功能。

<%@ OutputCache Duration="#ofseconds" Location="Any | Client | Downstream | Server | None" Shared="True | False" VaryByControl="controlname" VaryByCustom="browser | customstring" VaryByHeader="headers" VaryByParam="parametername" %>
属性
Duration
页或用户控件进行缓存的时间(以秒计)。在页或用户控件上设置该属性为来自对象的 HTTP 响应建立了一个过期策略,并将自动缓存页或用户控件输出。
注意 该属性是必需的。如果未包含该属性,将出现分析器错误。
Location
OutputCacheLocation 枚举值之一。默认值为 Any。
警告 包含在用户控件(.ascx 文件)中的 @ OutputCache 指令不支持此属性。
Shared
一个布尔值,确定用户控件输出是否可以由多个页共享。默认值为 false。有关详细信息,请参见备注部分。
注意 包含在 ASP.NET 页(.aspx 文件)中的 @ OutputCache 指令不支持此属性。
VaryByCustom
表示自定义输出缓存要求的任意文本。如果赋予该属性的值是 browser,缓存将随浏览器名称和主要版本信息的不同而不同。如果输入了自定义字符串,您必须在应用程序的 Global.asax 文件中重写 HttpApplication.GetVaryByCustomString 方法。
VaryByHeader
分号分隔的 HTTP 标头列表,用于使输出缓存发生变化。当将该属性设为多标头时,对于每个指定的标头,输出缓存都包含一个请求文档的不同版本。
注意 设置 VaryByHeader 属性在所有 HTTP 1.1 缓存中启用缓存项,而不仅限于 ASP.NET 缓存。用户控件中的 @ OutputCache 指令不支持此属性。
VaryByParam
分号分隔的字符串列表,用于使输出缓存发生变化。默认情况下,这些字符串与用 GET 方法属性发送的查询字符串值对应,或与用 POST 方法发送的参数对应。当将该属性设置为多参数时,对于每个指定的参数,输出缓存都包含一个请求文档的不同版本。可能的值包括 none、* 和任何有效的查询字符串或 POST 参数名称。
警告 在输出缓存 ASP.NET 页时,该属性是必需的。它对于用户控件也是必需的,除非已经在用户控件的 @ OutputCache 指令中包含了 VaryByControl 属性。如果没有包含它,则发生分析器错误。如果您不想使缓存内容随任何指定参数发生变化,请将该值设为 none。如果要使输出缓存根据所有参数值发生变化,请将属性设置为 *。
VaryByControl
一个分号分隔的字符串列表,用于更改用户控件的输出缓存。这些字符串代表在用户控件中声明的 ASP.NET 服务器控件的 ID 属性值。有关详细信息,请参见缓存 ASP.NET 页的某些部分。
注意 除非已经包含了 VaryByParam 属性,否则在用户控件 @ OutputCache 指令中,该属性是必需的。ASP.NET 页中的 @ OutputCache 指令不支持该属性。
备注
为页输出缓存设置值与通过 HttpResponse.Cache 属性操作 HttpCachePolicy.SetExpires 和 HttpCachePolicy.SetCacheability 方法相同。如果在创建用户控件时设置 VaryByParam 属性,可实现该控件的部分页缓存。

如果 Web 窗体页要求用户查看授权,则输出缓存将 Cache-Control HTTP 标头设置为 private。有关所有这些主题的详细信息,请参见缓存 ASP.NET 页。

如果将 Shared 属性设置为 true,则缓存的用户控件输出可以被多个 Web 窗体页访问。如果不设置为 true,默认行为是为包含用户控件的每一页缓存用户控件输出的一个版本。通过启用 Shared 属性,可以潜在地节省大量的内存。有关详细信息,请参见缓存 ASP.NET 页的某些部分。

示例
下面的示例说明了如何设置页或用户控件进行输出缓存的持续时间。

<%@ OutputCache Duration="100" VaryByParam="none" %>
下一个示例说明了如何指示输出缓存来对页或用户控件进行缓存,此缓存处理是根据来自窗体的 POST 或来自查询字符串的位置和计数窗体参数进行的。每个收到的具有不同位置或计数参数(或两者)的 HTTP 请求都进行 10 秒的缓存处理。带有相同参数值的任何后继请求都将从缓存中得到满足,直至超过输入的缓存期。

<%@ OutputCache Duration="100" VaryByParam="location;count" %>

分享到:
评论

相关推荐

    asp.net2.0缓存

    首先,我们要理解ASP.NET 2.0缓存的两种主要类型:页面输出缓存和数据缓存。页面输出缓存将完全渲染后的HTML页面存储在内存中,当用户请求相同页面时,服务器直接返回缓存的HTML,而不是重新生成。数据缓存则用于...

    ASP.NET 数据库缓存

    此外,ASP.NET的输出缓存也是提高性能的重要手段,它可以缓存整个页面或部分页面的输出,减少服务器的处理和传输负担。对于静态内容或不常变化的数据,输出缓存尤其有效。 总的来说,ASP.NET 2010的数据库缓存策略...

    ASP.NET_缓存技术

    在这个例子中,`OutputCache`特性告诉ASP.NET缓存Index方法的输出结果60秒,并且对所有参数变化创建不同的缓存副本。 通过深入理解和熟练运用ASP.NET的缓存技术,开发者能够优化Web应用程序的性能,提供更流畅的...

    asp.net缓存(页面输出缓存和应用程序缓存)

    ASP.NET缓存技术是提升Web应用性能的关键策略之一,它主要分为页面输出缓存和应用程序缓存两大类。这两种缓存机制旨在减少服务器处理请求的时间,降低数据库负载,并且提高用户体验,通过存储已经生成的HTML页面或...

    ASP.NET15缓存机制.rar

    ASP.NET 的缓存系统分为两种主要类型:页面输出缓存和数据缓存。页面输出缓存将整个HTML页面存储在内存中,当相同的请求再次到达时,可以直接从缓存中提供页面,而无需重新生成。数据缓存则主要用于存储应用程序中...

    ASP.NET2.0输出缓存

    ASP.NET 2.0 输出缓存是针对由数据库驱动的Web应用程序提高性能的关键技术。由于数据库查询通常是应用程序响应时间的主要瓶颈,尤其是面对高并发和大数据量的场景,缓存技术可以显著提升用户体验。缓存的基本原理是...

    充分利用ASP.NET的三种缓存提高站点性能

    ASP.NET 提供了三种主要形式的缓存:页面级输出缓存、用户控件级输出缓存(或称为片段缓存)和缓存 API。输出缓存和片段缓存的优点是非常易于实现,在大多数情况下,使用这两种缓存就足够了。而缓存 API 则提供了...

    asp.net缓存 缓存

    ASP.NET缓存是微软开发的Web应用程序框架中的一个重要特性,用于提高网站性能和减少服务器负载。缓存技术在.NET框架中扮演着至关重要的角色,它能够存储数据以便快速访问,从而减少对数据库或其他慢速资源的依赖。在...

    ASP.NET 2.0快速入门(5):ASP.NET 2.0 缓存技术

    首先,我们需要了解ASP.NET 2.0中的两种主要缓存机制:页面输出缓存和数据缓存。页面输出缓存可以保存整个HTML页面的副本,当用户请求相同的页面时,直接从缓存中提供,而不是重新生成页面。这显著减少了服务器的...

    ASP.NET数据缓存技术

    ASP.NET数据缓存技术是微软开发的Web应用程序框架ASP.NET中的一个重要特性,它主要用于提高网站性能,通过将常用数据暂存于内存中,避免频繁访问数据库,从而减少服务器的负载和响应时间。在这个主题中,我们将深入...

    ASP.NET中缓存技术(Cache)的了解运用(项目案例一个)

    ASP.NET的缓存技术是提高Web应用程序性能的关键工具,它允许开发者存储常用数据,避免频繁地从数据库中读取,从而显著减少服务器负载和响应时间。在这个项目案例中,我们将深入探讨ASP.NET中的Cache机制,了解其工作...

    ASP.NET缓存技术应用总结

    ASP.NET缓存技术是提升应用程序性能的关键手段,它通过存储常用数据或计算结果,避免了重复的数据库查询或计算,从而显著减少了响应时间。本文主要总结了ASP.NET中的各种缓存策略及其应用。 首先,我们要了解缓存的...

    ASP.NET缓存剖析

    在ASP.NET中,还有页面输出缓存API,它提供了一组方法和属性,用于控制何时以及如何缓存页面内容。开发者可以通过设置`OutputCache`指令来实现页面级别的缓存配置,也可以利用`HttpCachePolicy`类进行更细粒度的控制...

    .NET系统缓存简介

    1. `Insert`方法:类似`MemoryCache.Add`,但ASP.NET Cache提供了更多的缓存依赖选项,如页面输出缓存、文件系统缓存依赖等。 2. `Get`和`Remove`方法与`MemoryCache`相似。 3. `CacheDependency`类:用于创建缓存...

    asp.net缓存技术

    OutputCache 是 ASP.NET 中一种重要的缓存机制,用于缓存页面输出。它可以避免服务器频繁地生成相同内容的页面,从而极大地提高了网站的性能。 ##### 1. **基本配置** 在 ASP.NET 页面中使用 OutputCache,可以...

    ASP.NET 缓存:方法和最佳实践

    本文主要讨论了ASP.NET中三种主要的缓存方式:页面级输出缓存、用户控件级输出缓存(片段缓存)以及缓存API。下面将详细阐述这些缓存方法及其最佳实践。 1. **页面级输出缓存** 页面级输出缓存是最简单的缓存形式,...

Global site tag (gtag.js) - Google Analytics