如果应用程序用复杂的逻辑需要大量处理时间来创建数据,并且用户频繁的访问该数据,或者应用程序包含一个处理复杂数据但不需要经常更新的页,通常这种开销大以及使用频繁的数据,需要用到缓存(存放于内存)来提高程序的性能。 ASP.NET 有两种缓存方式:第一种机制是应用程序缓存,该方式是缓存数据,如 DataSet 或自定义业务对象。第二种机制是页输出缓存,该方式是缓存页面,在用户再次请求该页时,重用该页所保存的输出,
应用程序缓存
应用程序缓存的实现是全局的,该缓存方式与应用程序状态类似,但是,与应用程序状态不同的是,应用程序缓存中的数据是没有保证且不能够被修改的,因为该缓存是由 ASP.NET 来管理的, asp.net 会在数据过期、无效、或内存不足时移除缓存中的数据,一般使用应用程序缓存时,需要提供一种机制,确定在访问数据时该数据是否存在于缓存中或是否被修改,如果存在并且没有修改,则使用。如果不存在或已改动,则重新创建,然后将其放回缓存中,这样可确保缓存中始终有最新的数据。 System.Web.Caching 命名空间提供用于缓存服务器上常用数据的类,此命名空间包含 Cache 类,该类是一个字典,您可以在其中存储数据对象,如哈希表和数据集。
DataSet ds = HttpContext .Current.Cache["Users" ] as DataSet ;
if (ds == null )
{ //HttpContext.Current.Cache.Insert("key", "CreateCache()");
HttpContext .Current.Cache["Users" ] = CreateCache();
}
GridView1.DataSource = ds;
GridView1.DataBind();
页输出缓存
这一机制允许 ASP.NET 向客户端发送页响应,而不必再次经过页处理生命周期。可以分别为每个页配置页缓存,也可以在 Web.config 文件中创建缓存配置文件。页输出缓存提供了三种页缓存方式:整页缓存、控件缓存和缓存后替换。控件缓存有时也称为分段缓存,这种方式允许将信息包含在一个用户控件内,然后将该用户控件标记为可缓存的;缓存后替换是对控件缓存的一个补充,它能够重新生成一个缓存页面的特定部分,该技术只需要在页面中使用<asp:Substitution>标签即可。页或用户控件的可缓存性指的是某一页是否能在该页的响应生命周期内缓存在某个设备上,这些设备包括发出请求的浏览器,响应请求的 Web 服务器,以及请求或响应流中任何可执行缓存的设备,如代理服务器。
1 : 使用缓存配置文件以声明方式设置页的可缓存性
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="Cache30Seconds" duration="30" varyByParam="none" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
在缓存页面中配置缓存页应当使用名为 Cache30Seconds 的缓存配置
<%@ OutputCache CacheProfile="Cache30Seconds" %>
2 :以编程方式设置页的可缓存性
Response.Cache.SetCacheability(HttpCacheability.Public);
缓存依赖项
ASP.NET使用了依赖机制解决了过期数据问题。可以将缓存中某一项的生存期配置为依赖于其他应用程序元素,如某个文件或数据库表。当缓存项依赖的元素更改时, ASP.NET 将从缓存中移除该项。CacheDependency类提供了多个构造函数能够和关联于依赖关系的实体进行交互。 ASP.NET 缓存支持下表中描述的依赖项:
依赖项 |
说明 |
键依赖项 |
应用程序缓存中的项存储在键 / 值对中。键依赖项允许项依赖于应用程序缓存中另一项的键。如果移除了原始项,则具有键依赖关系的项也会被移除。例如,可以添加一个名为 ReportsValid 的缓存项,然后缓存若干个依赖于 ReportsValid 键的报告。当 ReportsValid 项被移除时,所有依赖于它的缓存报告同样也会从缓存中移除。 Response.AddCacheItemDependency("key1" ); Response.Cache.SetExpires(DateTime .Now.AddMinutes(1d));// 页的过期时间 Response.Cache.SetCacheability(HttpCacheability .Public);// 页的可缓存性 Response.Cache.SetValidUntilExpires(true );// 忽略无效的客户端所发送的HTTP 标头 |
文件依赖项 |
缓存中的项依赖于外部文件。如果该文件被修改或删除,则缓存项也会被移除。 Context.Cache.Insert("cachekey", "value", new CacheDependency(@"D:/temp/test.txt"));
|
SQL 依赖项 |
缓存中的项依赖于数据库中表的更改 . Cache.Insert("EmployeeKey" , dv, new SqlCacheDependency ("TestDB" , "users" ) ); |
聚合依赖项 |
通过使用 AggregateCacheDependency 类缓存中的项依赖于多个元素。如果任何依赖项发生更改,该项都会从缓存中移除。 |
自定义依赖项 |
可以用您自己的代码创建的依赖关系来配置缓存中的项。例如,可以创建一个自定义 Web 服务缓存依赖项,当调用 Web 服务得到一个特定值时,该依赖项就会从缓存中移除数据。 |
以下示例是向 ASP.NET 应用程序添加一个 SqlCacheDependency 来侦听通知和正确更新缓存:
配置文件:
<system.web>
<caching>
<sqlCacheDependency enabled = "true" pollTime = "60000" >
<databases>
<add name="Pubs" connectionStringName="PubsConn" />
<!-- <clear /> -->
<!-- <remove name="Pubs" /> -->
</databases>
</sqlCacheDependency>
</caching>
</system.web>
</configuration>
手动编写:
// 缓存依赖项( 当employee表中的数据更改时,缓存失效并被移除)
SqlCacheDependency sqlcache = new SqlCacheDependency ("Pubs" , "employee" );
Cache.Insert("EmployeeKey" , dv, sqlcache );
应用程序缓存项移除通知
在大多数缓存方案中,当从缓存中移除项后,直到再次需要此项时,才需要将其放回缓存中。典型的开发模式是在使用项之前始终检查该项是否已在缓存中。如果项位于缓存中,则可以使用。如果不在缓存中,则应再次检索该项,然后将其添加回缓存 。 但是,在某些情况下,如果从缓存中移除项时通知应用程序,可能更好。比方说如果有一个需要大量处理时间才能创建的缓存项,当从缓存中移除时,如果能收到通知以便可以立即替换该项,在下次请求该项时,用户便减去了创建处理该项的等待时间。
// 添加具有依赖项、过期、优先级策略及一个从CACHE 移除缓存项时通知应用程序的委托的缓存对象
HttpContext .Current.Cache.Add("key1" , "InsertCache()" ,sqlcache,DateTime .MaxValue,
new TimeSpan (0, 1, 0), CacheItemPriority .Default, ReportRemovedCallback);
public static void ReportRemovedCallback(String key, object value, CacheItemRemovedReason removedReason){//..}