ASP.NET 缓存学习——概述

ASP.NET

(以下内容摘自MSDN)

ASP.NET存概述

通常,应用程序可以将那些频繁访问的数据,以及那些需要大量处理时间来创建的数据存储在内存中,从而提高性能。例如,如果应用程序

使用复杂的逻辑来处理大量数据,然后再将数据作为用户频繁访问的报表返回,避免在用户每次请求数据时重新创建报表可以提高效率。同

样,如果应用程序包含一个处理复杂数据但不需要经常更新的页,则在每次请求时服务器都重新创建该页会使工作效率低下。 有关更多信

息,请参见缓存应用程序数据

在这些情况下,为了帮助您提高应用程序的性能,ASP.NET 使用两种基本的缓存机制来提供缓存功能。第一种机制是应用程序缓存,它允许

缓存页的多个版本缓存所生成的数据,如 DataSet 或自定义报表业务对象。第二种机制是页输出缓存,它保存页处理输出,并在用户再

次请求该页时,重用所保存的输出,而不是再次处理该页。

应用程序缓存

应用程序缓存提供了一种编程方式,可通过键/值对将任意数据存储在内存中。使用应用程序缓存与使用应用程序状态类似。但是,与应用程

序状态不同的是,应用程序缓存中的数据是易失的,即数据并不是在整个应用程序生命周期中都存储在内存中。使用应用程序缓存的优点是由

ASP.NET 管理缓存,它会在项过期、无效、或内存不足时移除缓存中的项。还可以配置应用程序缓存,以便在移除项时通知应用程序。

使用应用程序缓存的模式是,确定在访问某一项时该项是否存在于缓存中,如果存在,则使用。如果该项不存在,则可以重新创建该项,然后

将其放回缓存中。这一模式可确保缓存中始终有最新的数据。

页输

页输出缓存在内存中存储处理后的 ASP.NET 页的内容。这一机制允许 ASP.NET 向客户端发送页响应,而不必再次经过页处理生命周期。页

输出缓存对于那些不经常更改,但需要大量处理才能创建的页特别有用。例如,如果创建大通信量的网页来显示不需要频繁更新的数据,页输

出缓存则可以极大地提高该页的性能。可以分别为每个页配置页缓存,也可以在 Web.config 文件中创建缓存配置文件。利用缓存配置文件,

只定义一次缓存设置就可以在多个页中使用这些设置。

页输出缓存提供了两种页缓存模型:整页缓存和部分页缓存。整页缓存允许将页的全部内容保存在内存中,并用于完成客户端请求。部分页缓

存允许缓存页的部分内容,其他部分则为动态内容。有关更多信息,请参见缓存 ASP.NET 页

部分页缓存可采用两种工作方式:控件缓存和缓存后替换。控件缓存有时也称为分段缓存,这种方式允许将信息包含在一个用户控件内,然后

将该用户控件标记为可缓存的,以此来缓存页输出的部分内容。这一方式可缓存页中的特定内容,并不缓存整个页,因此每次都需重新创建整

个页。例如,如果要创建一个显示大量动态内容(如股票信息)的页,其中有些部分为静态内容(如每周总结),这时可以将静态部分放在用

户控件中,并允许缓存这些内容。

缓存后替换与控件缓存正好相反。这种方式缓存整个页,但页中的各段都是动态的。例如,如果要创建一个在规定时间段内为静态的页,则可

以将整个页设置为进行缓存。如果向页添加一个显示用户名的 Label 控件,则对于每次页刷新和每个用户而言,Label 的内容都将保持不变

,始终显示缓存该页之前请求该页的用户的姓名。但是,使用缓存后替换机制,可以将页配置为进行缓存,但将页的个别部分标记为不可缓存

。在此情况下,可以向不可缓存部分添加 Label 控件,这样将为每个用户和每次页请求动态创建这些控件。

有关更多信息,请参见缓存 ASP.NET 页的某些部分

根据求参数

除缓存页的单一版本外,ASP.NET 页输出缓存还提供了一些功能,可以创建根据请求参数的不同而不同的页的多个版本。有关更多信息,请参

缓存页的多个版本

移除数据

出于以下原因之一,ASP.NET 可以从缓存中移除数据:

  • 由于服务器上的内存不足,开始一个称为“清理”的过程。
  • 由于缓存中的项已过期。
  • 由于项的依赖项发生了更改。

为了帮助管理缓存项,在将项从缓存中移除时,ASP.NET 会通知应用程序。

清理

清理是在内存不足时从缓存中删除项的过程。如果某些项在一段时间内未被访问,或是在添加到缓存中时被标记为低优先级,则这些项会被移

除。ASP.NET 使用 CacheItemPriority 对象来确定要首先清理的项。有关更多信息,请参见如何:将项添加到缓存中

除了清理外,在缓存项过期时,ASP.NET 会自动从缓存中移除这些项。向缓存添加项时,可以按下表中的描述设置其过期时间。

过期类型

说明

可调过期

指定某项自上次被访问后多长时间过期。例如,可以将某项设置为自上次在缓存中被访问后 20 分钟过期。

绝对过期

指定某项在设定的时间过期,而不考虑访问频率。例如,可以将某项设置为在 6:00 PM 过期,或四小时后过期。

赖项

可以将缓存中某一项的生存期配置为依赖于其他应用程序元素,如某个文件或数据库。当缓存项依赖的元素更改时,ASP.NET 将从缓存中移除

该项。例如,如果您的网站显示一份报告,该报告是应用程序通过 XML 文件创建的,您可以将该报告放置在缓存中,并将其配置为依赖于该

XML 文件。当 XML 文件更改时,ASP.NET 会从缓存中移除该报告。当代码请求该报告时,代码会先确定该报告是否在缓存中,如果不在,代

码会重新创建该报告。因此,始终都有最新版本的报告可用。

ASP.NET 缓存支持下表中描述的依赖项。

依赖项

说明

键依赖项

应用程序缓存中的项存储在键/值对中。键依赖项允许项依赖于应用程序缓存中另一项的键。如果移除了原始项,则具有键依赖关系

的项也会被移除。例如,可以添加一个名为 ReportsValid 的缓存项,然后缓存若干个依赖于 ReportsValid 键的报告。当

ReportsValid 项被移除时,所有依赖于它的缓存报告同样也会从缓存中移除。

文件依赖项

缓存中的项依赖于外部文件。如果该文件被修改或删除,则缓存项也会被移除。

SQL 依赖项

缓存中的项依赖于 Microsoft SQL Server 2005、SQL Server 2000 或 SQL Server 7.0 数据库中表的更改。对于 SQL Server

2005,缓存中的项可依赖于表中的某一行。有关更多信息,请参见使用 SqlCacheDependency 类在 ASP.NET 中缓存

聚合依赖项

通过使用 AggregateCacheDependency 类缓存中的项依赖于多个元素。如果任何依赖项发生更改,该项都会从缓存中移除。

自定义依赖项

可以用您自己的代码创建的依赖关系来配置缓存中的项。例如,可以创建一个自定义 Web 服务缓存依赖项,当调用 Web 服务得到

一个特定值时,该依赖项就会从缓存中移除数据。

用程序移除通知

当项从应用程序缓存中移除时,您可以收到通知。例如,如果有一个需要大量处理时间才能创建的项,当从缓存中移除该项时,您会收到通知以便可以立

即替换该项。这样,下次请求该项时,用户便不必等待处理该项。有关更多信息,请参见如何:从缓存中移除项时通知应用程序

ASP.NET 2.0缓存中的新增功能

ASP.NET 2.0 版保留了 ASP.NET 1.1 版的所有缓存功能,同时添加了新功能并增强了现有功能。新功能包括缓存配置文件、自定义缓存依赖项、SQL 缓

存依赖项以及在缓存页中创建动态内容(缓存后替换)。增强功能包括功能更强大的部分页(控件)缓存模型、增强的缓存配置以及输出缓存指令的改进。

存功能

存配置文件

缓存配置文件使您能够在应用程序的 Web.config 文件中创建缓存设置,然后在单个页上引用这些设置。这使您能够将缓存设置同时应用于多页。例如,

可以定义一个名为 DailyUpdate 的缓存配置文件,它将页的缓存持续时间设置为一天。然后可以配置各个页使用 DailyUpdate 缓存配置文件,并且这

些页的缓存持续时间为一天。如果将 DailyUpdate 缓存配置文件更改为不使用缓存,将停止缓存这些页。

有关更多信息,请参见 ASP.NET 中的缓存配置

自定义缓存依赖项

在 ASP.NET 2.0 中,您可以根据应用程序特定情况创建自己的自定义缓存依赖项。若要创建自定义缓存依赖项,请创建从 CacheDependency 继承的类

并在自定义类中实现您自己的依赖项方法。例如,您可以创建在 Web 服务中轮询数据的依赖项;当数据发生变化时,您可以使缓存数据无效。若要了解

通过指定依赖项向缓存添加项目的信息,请参见如何:将项添加到缓存中

SqlCacheDependency

ASP.NET 2.0 引入了 SqlCacheDependency 类,它使您能够在缓存中配置一个项,以便在 Microsoft SQL Server 数据库中的表或行上拥有依赖项。

当表中或特定行中发生更改时,具有依赖项的缓存项便会失效并从缓存中移除。ASP.NET 2.0 使您能够在 SQL Server 7.0、SQL Server 2000 和 SQL

Server 2005 中设置表的依赖项。使用 SQL Server 2005 时,您还可以设置特定记录的依赖项。

有关更多信息,请参见使用 SqlCacheDependency 类在 ASP.NET 中缓存

存后替

ASP.NET 2.0 现在支持缓存后替换,使您能够将页中的某一部分配置为不可缓存。因此,尽管缓存了该页,但在再次请求该页时,将重新处理它的部分内容。

例如,您可以使用大多数静态内容(但不能使用在 Label 控件中显示用户名的内容)创建缓存页。如果不使用缓存后替换,用户名在所有请求中保持不变。

如果使用缓存后替换,您可以将页标记为可缓存,然后将 Label 控件放置在标记为不可缓存的另一个控件中。此后每次请求该页时,都会刷新用户名。

有关更多信息,请参见缓存 ASP.NET 页的某些部分

存增

控件

在 ASP.NET 1.1 中,通过设置 @ Control 指令中的参数以声明方式配置用户控件缓存。在 ASP.NET 2.0 中,可以在运行时使用 CachePolicy 对象配置

用户控件缓存设置。CachePolicy 对象使您能够按照以编程方式处理页输出缓存的相同方式处理用户控件缓存。

有关更多信息,请参见缓存 ASP.NET 页的某些部分

存配置增

除了缓存配置文件外,ASP.NET 2.0 中还引入了新的缓存配置设置,可以在应用程序的 Web.config 文件中指定这些设置。这些设置增加了您对缓存的控制,

如内存使用量和缓存清理行为。有关更多信息,请参见 ASP.NET 中的缓存配置

存指令改

ASP.NET 2.0 包括新的 @ OutputCache 指令选项以及对现有选项的增强。新功能和增强功能使您能够对输出缓存功能进行声明控制,而以前只能使用

HttpCachePolicy 类以编程方式实现此类控制。例如,现在可以用声明方式设置页 @ OutputCache 指令中的 Duration 属性和 NoStore 属性。

有关更多信息,请参见设置页的可缓存性