您的位置:首页 > 编程语言 > ASP

ASP.NET缓存技术学习入门---页面缓存(OutPut Caching)

2010-08-10 11:36 405 查看
以前写程序从来都没用过缓存(水平太菜),好在以前做的网站访问量都非常的小,所以性能问题也不突出,但是如果做一个正规的项目,不论大小,缓存技术是必须要使用到的。今天学习了三种常用的缓存技术,下面先讲第一种,非常的简单,相信大家一定能看明白。

  先说下为什么要用缓存,在正常情况下,当一个用户要访问www.abc.com/index.aspx这个页面时,他的IE会给我们的网站服务器端发出一个浏览请求,我们的服务器收到请求后就会执行index.aspx文件相关的代码,执行完成后生成一个HTML文件,然后发送给用户的IE,如果有1000个人访问这个页面的话,哪服务器就要把index.aspx的代码执行1000次再发送1000次,在使用页面缓存技术之后我们把index.aspx页面缓存起来,这样就有可能做到1000个人访问,服务器只执行200次代码,再发送1000次,与前面相比较服务器少执行800次代码,大家想想看这会对服务器的效率有多么大的提高啊!如何做到这一点呢?请看“页面缓存”

页面缓存(OutPut Caching)


  页面缓存的使用方法非常的简单,只需要在aspx页的顶部加一句声明
<%@ OutputCache Duration="60" VaryByParam="none" %>
Duration="60" 的意思是指定缓存的时间为60秒,可根据情况自已设定
VaryByParam="none" 的意思是设定无参数缓存(有参数的缓存下面会讲到)
  这两个参数是必须的,不能缺省。另外还有一个重要的参数
DiskCacheable="true|false" 意思是要不要把缓存放到硬盘上,如果设为false则缓存数据会放到内存中
  这里需要注意一下,如果页面数据很小的话可以把缓存数据放到内存中,如果数据较大最好放到硬盘上,
否则会占用大量内存影响服务器运行,如果数据缓存到硬盘上的话,记得要把Duration=""的值设的大一些如Duration="3600",如果设的太小,服务器会过于频繁的在硬盘上写数据反而会降低性能,如果在内存中缓存数据Duration""则不要设的太长,当然具体时间长短要大家自己多尝试才知道。

  以上就是一个最简单的页面缓存的实现方法,再来回过头讲一下原理,先看个例子:
  新建一个cache1.aspx文件,在页面开始处加一句<%@ OutputCache Duration="60" VaryByParam="none"
%>然后在代码里写一句Response.Write(DateTime.Now),运行后显示出了当前时间,好,我们开始刷新这个页面,你会发现页面显示的时间停住不变,始终是第一次运行时的时间,现在,我们等待1分钟后再刷新页面,这时页面显示的时间变成了当前时间,再反复刷新,显示的时间又不变了,为什么呢?当第一个用户请求浏览cache1.aspx页时,服务器会执行cache1.aspx的代码生成一个HTML发送给用户,同时把这个HTML缓存到内存中,当第二次,第三次……发送浏览请求时,服务器不再执行cache1.aspx里的代码而是直接把缓存中的HTML发给用户端,60秒内都是如此,60秒后缓存被消除,当下一个请求出现时服务器会再执行cache1.aspx的代码,并把生成的HTML缓存60秒……

  这里我们要注意一个问题,如果你的部分数据要求能够实时显示的话,那就不能使用整页缓存了,就要使用部分缓存,如何部分缓存,最简单的办法就是自定义一个用户控件,在用户控件里开头加<%@ OutputCache Duration="60" VaryByParam="none" %>的声明,这样当你在某个页面里使用这个控件时,页面里的其他数据不会被缓存,只有这个控件的内容会被缓存,具体就说了,很简单,大家自己试一试吧

注意:DiskCacheable="true|false"的设置在VS2005正式版里不再正式支持,所以在MSDN里找不到关于它的说明,我咨询了微软的讲师,说是把缓存放到硬盘上在实际使用中会出现一些问题.现在我们在VS2005正式版里依然可以使用这个设置,但是会不会产生实际效果我就不清楚了,大家有知道的就说一声吧!

使用@ OutputCache指令

使用@ OutputCache指令,能够实现对页面输出缓存的一般性需要。@ OutputCache指令在ASP.NET页或者页中包含的用户控件的头部声明。这种方式非常方便,只需几个简单的属性设置,就能够实现页面的输出缓存 策略。@ OutputCache指令声明代码如下。

@ OutputCache指令代码

<%@ OutputCache CacheProfile =" " NoStore= "True | False" Duration ="#ofseconds" Shared ="True | False" Location ="Any | Client | Downstream | Server | None | ServerandClient " SqlDependency ="database/table name pair | CommandNotification " VaryByControl ="controlname" VaryByCustom ="browser | customstring" VaryByHeader ="headers" VaryByParam ="parametername" %>

如上所示,在@ OutputCache指令中,共包括10个属性,它们是CacheProfile、NoStore、Duration、Shared、 Location、SqlDependency、VaryByControl、VaryByCustom、VaryByHeader和 VaryByParam。这些属性将对缓存时间、缓存项的位置、SQL数据缓存依赖等各方面进行设置。下面简要介绍以上属性的基本概念。

CacheProfile

用于定义与该页关联的缓存设置的名称。是可选属性,默认值为空字符("")。需要注意的是,包含在用户控件中的@ OutputCache指令不支持此属性。在页面中指定此属性时,属性值必须与Web.config文件<outputCacheSettings>配置 节下的outputCacheProfiles元素中的一个可用项的名称匹配。如果此名称与配置文件项不匹配,将引发异常。

NoStore

该属性定义一个布尔值,用于决定是否阻止敏感信息的二级存储。需要注意的是,包含在用户控件中的@ OutputCache指令不支持此属性。将此属性设置为true等效于在请求期间执行代码“Response.Cache.SetNoStore();”。

Duration

用于设置页面或者用户控件缓存的时间。单位是秒。通过设置该属性,能够为来自对象的HTTP响应建立了一个过期策略,并将自动缓存页或用户控件输出。需要注意的是,Duration属性是必需的,否则将会引起分析器错误。

Shared

该属性定义一个布尔值,用于确定用户控件输出是否可以由多个页共享。默认值为false。注意,包含在ASP.NET页中的@ OutputCache指令不支持此属性。

Location

用于指定输出缓存项的位置。其属性值是OutputCacheLocation枚举值,它们是Any、Client、Downstream、None、 Server和ServerAndClient。默认值是Any,表示输出缓存可用于所有请求,包括客户端浏览器、代理服务器或处理请求的服务器上。需要注意的是,包含在用户控件中的@ OutputCache指令不支持此属性。

SqlDependency

该属性标识一组数据库/表名称对的字符串值,页或控件的输出缓存依赖于这些名称对。需要注意:SqlCacheDependency类监视输出缓存所依赖 的数据库中的表,因此,当更新表中的项时,使用基于表的轮询将从缓存中移除这些项。当通知(在SQL Server 2005中)与CommandNotification值一起使用时,最终将使用SqlDependency类向SQL Server 2005服务器注册查询通知。另外,SqlDependency属性的CommandNotification值仅在ASP.NET页中有效。控件只能将 基于表的轮询用于@ OutputCache指令。

VaryByControl

该属性使用一个分号分隔的字符串列表来更改用户控件的输出缓存。这些字符串代表在用户控件中声明的ASP.NET服务器控件的ID属性值。除非已经包含了VaryByParam属性,否则在@ 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”。如果要使输出缓存根据所有参数值发生变化,则将属性设置为“*”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: