ASP.NET中缓存的详解

页面输出缓存属性设置:

用@OutputCache指令设置页面输出缓存。@OutputCache指令在asp.net页或者页中包含的用户控件的头部

声明。

@OutputCache的常用属性如下:

1、    CacheProfile 此属性是为了调用webconfig文件中<outputCacheSetting>节下

<outputCacheProfiles> 节点下一个可用项。

如:webconfig中增加节点<caching>

<caching>

        <outputCacheSettings>

          <outputCacheProfiles>

            <add name="webCache" duration="10" varyByControl="none" varyByParam="none"/>

          </outputCacheProfiles>

        </outputCacheSettings>

</caching>

那么在页头的设置为

<%@ OutputCache CacheProfile="webCache"%>即可。

需要注意的是包含用户控件中的@OutputCache指令不支持此属性。

2、    NoStore

此属性定义一个布尔值,用于决定是否阻止敏感信息的二级存储。需要注意的是包含用户控件中的

@OutputCache指令不支持此属性。将此属性设为true,等效于在请求期间执行代码”

Response.Cache.SetNoStore()”

3、    Duration

用于设置缓存的时间,单位是秒。

需要注意的是:该属性是必须的,否则将会引起分析器错误。

4、    Shared

该属性为布尔值,用于确定用户控件的输出是否可以有多个页共享。默认值为false。

需要注意的是:包含在ASP.NET页中的@outputCache指令不支持此属性。

5、 Location

   用于指定输出缓存项的位置。其属性值是OutputCacheLocation枚举值,他们是Any 、Client、

DownStream 、None 、Server和 ServerAndClient.。默认值为:Any。

   需要注意的是:包含用户控件中的@OutputCache指令不支持此属性。

6、 SqlDependency

该属性标识一组数据库/表名称对的字符串值,页或控件的输出缓存依赖于这些名称对。

7、 VaryByControl

该属性使用一个分号分隔的字符串列表来更改用户控件的输出缓存。该字符串为服务器控件的ID属性值。

除非已经包含了VaryByParam属性,否则在@OutputCache中此属性是必须的。

8、 VaryByCustom

用于自定义输出缓存要求的任意文本。如果属性值设为Brower,缓存将随浏览器名称和主要版本信息的不

同而异。如果输入了自定义字符串,必须在Global.asax文件中重写

HttpApplication.GetVaryByCustomString方法。

主要是为控件设置缓存。

9、 VaryByHeader

10、              VaryByParam

此属性基于使用POST或者GET方式发送的名称/值对来改变缓存。该属性是必须的

示例如下:

在一个web窗体中加入ID=”lab”的标签,以记录当前时间。一个ID=”btn”的控件,用于发送url。

1、 在webconfig中加入

<caching>

        <outputCacheSettings>

          <outputCacheProfiles>

            <add name="webCache" duration="10" varyByControl="none" varyByParam="name" />

          </outputCacheProfiles>

        </outputCacheSettings>

</caching>

2、页头引入<%@ OutputCache CacheProfile="webCache"%>

3、加入两个函数:

public void Page_Load(object sender, EventArgs e)

        {

            string str = DateTime.Now.ToString();

            lab.Text =str;

        }

public void btn_Click(object sender,EventArgs e)

        {

            Random rnd = new Random();

            int n = rnd.Next(100);

            string str = n.ToString();

            string url = "OutputCache.aspx?name=" + str;

            Response.Redirect(url);

           

        }

这样,在不单击按钮的情况之下,刷新页面的情况之下,lab控件的值每个十秒改变一次。但是,在单击

btn之下,lab控件的就跟着发生改变。

原因:btn改变了name的值,导致缓存失效。

 

页面输出缓存API

该方法的核心是调用System.Web.HttpCachePolicy.该类主要包含用于设置缓存特定的HTTP标头的方法和

用于控制ASP.NET页面输出缓存的方法。

Response.Cache返回类HttpCachePolicy的实例。

页面部分缓存

实现页面部分缓存有两种机制:

1、将缓存部分放在用户控件之中。―――控件缓存

控件缓存的实质是对用户控件的缓存设置。有三种方法:一是用@OutputCache指令声明设置。二是在代码

隐藏文件中使用PrticalCachingAttribute类设置用户控件缓存。三是用ControlCachePolicy类以编程方

式指定用户控件缓存设置。

2、缓存后替换机制。该方法是现设置整个页面缓存,再将页面中一部分设置为不缓存。

A、利用@OutputCache指令以声明的方式设置用户控件缓存。有六个属性:

Duration Shared SqlDependency VaryByControl VaryByCustom VaryByParam

注意:

当用户控件和放置用户控件的页面都设置了缓存之时:

以设置缓存过期时间长的为准.如:页面的缓存过期时间为100s,控件的缓存过期时间为50s,则控件的缓

存过期时间调整为100s。总之,以长时间为准。

B、在代码隐藏文件中使用PrticalCachingAttribute类设置用户控件缓存

   ParticalCachingAttribute类有4个构造函数和6个属性。

   [ParticalCaching(int duration)]

   [ParticalCaching(int duration,string varyByParams,

string varyByContorl,string varyByCustom)]

[ParticalCaching(int duration,string varyByParams,

string varyByContorl,string varyByCustom,bool shared)]

[ParticalCaching(int duration,string varyByParams,

string varyByContorl,string varyByCustom,string sqlDenpendency,bool shared )]

使用PrticalCachingAttribute类需要注意一下几点:

一是构造函数必需放在用户控件的声明头部,如

[PartialCaching(10)]

public partial class lab : System.Web.UI.UserControl

{

    protected void Page_Load(object sender, EventArgs e)

    {

        Label1.Text = DateTime.Now.ToString();
    }

}

这是用第一个构造函数来初始化PrticalCachingAttribute类对象,ASP.NET分析器将生成

ParticalCachingControl类的实例来包装该控件。

二是用户控件的加载是动态的,也就是说不能在声明之后直接使用。

生成ParticalCachingControl类的实例还有一个必要条件,必需通过TemplateControl.LoadControl方法

动态加载用户控件,并且将用户控件插入页面的控件层次中。如:

public void Page_Init(object sender, EventArgs e)

        {

           Control pca = TemplateControl.LoadControl("lab.ascx");

           Controls.Add(pca); }

或者直接在用户控件的文件中引用@OutputCache指令来实现ParticalCacheAttribute类的实例来包装用户

控件。然后动态加载用户控件

public void Page_Init(object sender, EventArgs e)

        {

           Control pca = TemplateControl.LoadControl("lab.ascx");

           Controls.Add(pca); }

总之,直接在用户控件的文件中引用@OutputCache指令或在用户控件的声明的头部使用

ParticalCacheAttribute的构造函数,效果是等效的。

C、三是用ControlCachePolicy类以编程方式指定用户控件缓存设置。

ControlCachePolicy类与上面的HttpCachePolicy类似,但是HttpCachePolicy用于页面输出缓存,而

ControlCachePolicy用于用户控件缓存。

创建ControlCachePolicy类实例方法:

必须访问ParticalCacheControl类的BasePartialCachingControl.CachePolicy属性

(BasePartialCachingControl是ParticalCacheControl)的基类。

而且还必须用LoadControl方法动态加载用户控件,这样才能获得ParticalCacheControl类包装的用户控

件。若要确定用户控件是否支持缓存,可检查SupportsCaching属性。

ControlCachePolicy实例仅在控件生命周期的Init和PreRender阶段之间,才能成功操作。因为在呈现控

件之后所进行的任何更改都无法影响缓存设置。

ControlCachePolicy的常用属性有;

Cached Dependency Duration SupportCaching VaryByControl 和VaryByParam

3个常用方法:

Public void SetExpires(DateTime expirationTime)

Public void SetSlidingExpiration( bool useSlidingExpiration )

Public voix SetVaryByCustom(string varyByCustom )

示例:

一是在用户控件的声明头部调用PartialCacheAttribute类的构造函数.实现PartialCacheAttribute类对

用户控件的包装。

[PartialCaching(10)]

public partial class lab : System.Web.UI.UserControl

{

    protected void Page_Load(object sender, EventArgs e)

    {

        Label1.Text = DateTime.Now.ToString(); }}

二是

public void Page_Init(object sender, EventArgs e)

        {

            PartialCachingControl pcc = LoadControl("lab.ascx") as PartialCachingControl;

            ControlCachePolicy ccp = pcc.CachePolicy;

            if (ccp.Duration >= TimeSpan.FromSeconds(10))

            {

                ccp.SetExpires(DateTime.Now.Add(TimeSpan.FromSeconds(15)));

                ccp.SetSlidingExpiration(false);

            }

            Controls.Add(pcc);      

        }
缓存后替换

实现机制是:将整个页面设置为页面输出缓存,对那些不缓存的部分使用缓存后替换功能。

实现方法:

1、 以声明方式使用Substitution控件

2、 以编程方式使用Substitution控件API

3、以隐式方式使用AdRotator控件

实例:

1、以声明方式使用Substitution控件

Substitution控件为替换控件。当页面(设置为页面输出功能)第一次执行时,Substitution控件也执行

,返回其显示的内容。当后续请求时,页面从缓存中读取。而Substitution控件每次都调用自己的回调函

数,实现内容的及时更新。

<asp:Substitution ID="" runat="server" MethodName="GetCurrentTime" />

此控件的声明中有个MethodName属性,以调用回调函数

此函数必须为:

1、必须为static类型

2、返回值必须为string类型

3、参数必须为HttpContext类型

如:

public static string GetCurrentTime(HttpContext hc)

        {

            return DateTime.Now.ToString();

        }

2以编程方式使用Substitution控件API

此方法主要是使用Response类的

Public void WriteSubstitution(HttpResponseSubstitutionCallBack callback) 方法

HttpResponseSubstitutionCallBack是一个委托类型,为

Public delegate string HttpResponseSubstitutionCallback(HttpContext context)

使用WriteSubstitution的方法的优点是可以调用任意对象的方法,而不是只能调用Page或者UserControl

对象的静态方法。

如在aspx页面中调用

<%Response.WriteSubstitution(new HttpResponseSubstitutionCallback(GetCurrentTime));%>方法。

3、以隐式方式使用AdRotator控件 请参照AdRotator控件的详细用法

应用程序数据缓存

主要功能:应用程序数据缓存主要功能是在内存中存储那些与应用程序相关的对象,通常这些对象都需要

耗费大量的服务器资源才能得到。

主要实现方法:应用程序数据缓存主要有Cache类实现,该类位于System.Web.Caching命名空间之中。

通常有三种方法:

1、 使用键值对直接将对象加入的缓存Cache对象之中。

Cache[“MyCache”]=TxtUserName.Text;

此方法的弊端是无法设置缓存有效期、依赖对象等。

2、 使用Cache对象的Add方法。

Public object Add(String key,object value, CacheDependency dependency, DateTime

absoluteExpiration,TimeSpan slidingExpiration, CacheItemPriority

priority,CacheItemRemovedCallback callback)

要想使用此方法,必须彻底弄明白这几个参数的意思。

其中最后一项是个委托类项,其原型为:

public delegate void CacheItemRemovedCallback (

            string key,

            Object value,

            CacheItemRemovedReason reason

)

当缓存对象被移除时,将调用此对应的处理函数。

注意:采用Add方法时,注意不要加入相同键的缓存对象,否则出现异常

3、 使用Insert方法。

Insert方法比较灵活,有4个重载函数。

名称
说明

Cache.Insert (String, Object)
向 Cache 对象插入项,该项带有一个缓存键引用其位置,并使用 CacheItemPriority 枚举提供的默认

值。

Cache.Insert (String, Object, CacheDependency)
向 Cache 中插入具有文件依赖项或键依赖项的对象。

Cache.Insert (String, Object, CacheDependency, DateTime, TimeSpan)
向 Cache 中插入具有依赖项和过期策略的对象。

Cache.Insert (String, Object, CacheDependency, DateTime, TimeSpan, CacheItemPriority,

CacheItemRemovedCallback)
向 Cache 对象中插入对象,后者具有依赖项、过期和优先级策略以及一个委托(可用于在从 Cache 移

除插入项时通知应用程序)。

注意:

当Insert方法加入具有相同键名的对象时,出现覆盖现象。不出现异常。这是Insert方法与Add方法的主

要区别。

缓存依赖

功能机制:将缓存对象与缓存依赖对象(如文件、目录、数据表)建立关联,当这些缓存依赖对象更改时

,移除缓存对象。下次请求时,重设缓存对象。这样,始终保持缓存对象存储的数据是最新的。

缓存依赖类关系图:

CacheDependency

AggregateCacheDependency

SqlCacheDependency

实现方法:通过CacheDependency类的9大构造函数,来构造缓存依赖,来监视跟踪对所指定的文件、目录

、或其他缓存依赖的更改。在通过Cache类的Insert或Add方法,设置缓存依赖与缓存对象之间的关系。

CacheDependency类有两个重要的属性。一是HasChanged属性,表示依赖对象是否更改。

二是UtcLastModified属性,用于获取依赖对象上次被更改的时间。

示例代码为(实现自定义依赖类对象):

string fileName = Server.MapPath("file.xml");

CacheDependency cd = new CacheDependency(fileName, DateTime.Now);

Cache.Insert("CityFile",cityFile,cd);

实现聚合缓存依赖

聚合缓存依赖可以实现一个缓存对象与多个依赖对象建立关联。当每个依赖项发生更改时,就移除缓存对

象。

如:

CacheDependency dep1 = new CacheDependency(fileName1);

SqlCacheDependency dep2 = new SqlCacheDependency(cmd);

CacheDependency[] deps=new CacheDependency{dep1,dep2};

AggregateCacheDependency aggDep=new AggregateCacheDependency();

Cache.Insert("key",date,deps);

Sql数据缓存依赖

功能核心:利用SqlCacheDependency类,在应用程序数据缓存对象与SQLserver数据库表,或者SQL2005查

询结果之间,建立缓存依赖关系。当数据更改时,自动移除缓存对象。当下次请求时,如果该缓存对象不

在,则再次向缓存中添加更新后的版本。

由于sql版本不同,所以sql对缓存依赖的支持也不同。
SQLserver7.0 /2000
Sql2005

实现机制
使用基于轮询的实现机制
使用通知传递服务

是否需要配置启用
需要配置,以便启用
不需要,内置支持,自动启用

数据更改检测
只限于数据表级的检测
可应用于数据表级、数据行级的更改检测

是否支持SqlCacheDependency
支持
支持
SqlCacheDependency有两给构造函数

Public SqlCacheDependency(sqlcommand sql_cmd)

Public SqlCacheDependency(string datebaseEntryName,string tableName)

对于sql2005只能应用函数一:

注意(sqlcommand参数):

1、           必须完全限定表名。如:dbo.Customers

2、           Select中的参数不能使用*,必须一一列出。

如 select name,address,city, states from dbo.customers

如果页面设置的页面输出缓存设置的与sql2005的数据缓存依赖有关,则,不能使用此构造函数。

3、   不能在查询语句中使用聚合函数。

对于sql7.0/2000只能应用函数二:第一个参数必须与webconfig中<SqlCacheDependency>的<databases>

子配置节定义的数据库名称,这就意味着必须在webconfig中定义给该参数的数据库名称。如  

name="PubsDB"

connectionStringName="PubsString"是调用connectionStrings字节中的连接字符串名字。

<connectionStrings>

    <add name="PubsString" connectionString="server=localhost;database=pubs;user

id=sa;password=guest;"></add>

</connectionStrings>

///////////////////////////////////////////////////////

<caching>

<sqlCacheDependency>

<datebases>

<add name="PubsDB" connectionStringName="PubsString"></add>

</datebases>

</sqlCacheDependency>

</caching>

第二个参数用于设置关联的表名。

针对sql2000建立sql数据缓存依赖详细过程:

1、                利用aspnet_regsql.exe(默认情况之下:位于”

C:WINDOWS\Microsoft.NET\FrameWork\[“版本号”]”)工具从后台建立sql数据缓存依赖过程。其本质

是在后台使用SqlCacheDependencyAdmin类。

     第一步:打开dos命令窗口,输入

     aspnet_regsql –S localhoat –U sa –P mypassword –d pubs –ed

   Localhost为服务器名,sa为帐号,mypassword为密码,pubs为数据库名

   这样,将会提示数据库创建缓存依赖成功。

第二步:输入

aspnet_regsql –S localhoat –U sa –P mypassword –d pubs –t titles -et

titles为表名。这样将会提示为数据库表创建缓存依赖成功。

以上两步创建成功之后,打开SQL2000,查看数据库中的数据表将会发现:新建了一个名为:

ASPNet_SqlCacheTablesForChangeNotification的数据表。

此表具有三个字段:

TableName 用来设置缓存依赖的表。

NotificationCreated 用于存储数据表被更新的时间。

ChangedID 用来存储数据表被更改的次数。此时,如果数据表中的数据发生变化,changedID也将发生变

化。

2、在前台使用SqlCacheDependencyAdmin类来创建sql数据缓存依赖。
DisableNotifications
禁用指定数据库的 SqlCacheDependency 更改通知。
DisableTableForNotifications
已重载。 禁用 SQL Server 数据库表或数据库表的数组的 SqlCacheDependency 更改通知。
EnableNotifications
启用指定数据库的 SqlCacheDependency 更改通知。
EnableTableForNotifications
已重载。 连接到 SQL Server 数据库并为 SqlCacheDependency 更改通知准备一个或多个数据库表。
Equals
已重载。 确定两个 Object 实例是否相等。 (从 Object 继承。)
GetHashCode
用作特定类型的哈希函数。GetHashCode 适合在哈希算法和数据结构(如哈希表)中使用。 (从

Object 继承。)
GetTablesEnabledForNotifications
检索一个字符串数组,该数组包含 SQL Server 数据库中为其启用了更改通知的每个表的名称。
在前台操纵SqlCacheDependencyAdmin类,通常是在Global.aspx文件中,实现对sql数据缓存依赖功能的

统一管理。如:

void Application_Start(object sender, EventArgs e)

    {
        // 在应用程序启动时运行的代码
}

你可能感兴趣的:(asp.net)