asp.net2.0页面数据缓存的应用实例
页面数据缓存
应用程序数据缓存提供了一种编程方式,可通过键/值将任意数据存储在内存中。使用应用程序缓存与使用应用程序状态类似。但是,与应用程序状态不同的是,应用程序数据缓存中的数据是容易丢失的,即数据并不是在整个应用程序生命周期中都存储在内存中。
应用程序数据缓存的优点是由ASP.NET管理缓存,它会在项过期、无效或内存不足时移除缓存中的项,还可以配置应用程序缓存,以便在移除项时通知应用程序。
ASP.NET中提供了类似于Session的缓存机制,即页面数据缓存。利用数据缓存,可以在其中保存各种对象。对于各个应用程序来说,数据缓存只是在应用程序内共享,并不能在应用程序间进行共享。Cache类用于实现Web应用程序的缓存,在Cache中存储数据最简单的方法如下:
Cache["Key"]=Value;
从缓存中取数据时,需要先判断缓存中是否有内容,其方法如下:
Value=(string)Cache["key"];
If(Value!=null)
{
//do something
}
注意:从Cache中得到的对象是一个object类型的对象,因此在通常情况下,需要进行强制类型转换。
Cache类有两个很重要的方法,Add和Insert方法,其语法格式如下:
public Object Add[Insert] (
string key,
Object value,
CacheDependency dependencies,
DateTime absoluteExpiration,
TimeSpan slidingExpiration,
CacheItemPriority priority,
CacheItemRemovedCallback onRemoveCallback
)
参数说明如下所示。
key :用于引用该项的缓存键。
value:要添加到缓存的项。
dependencies:该项的文件依赖项或缓存键依赖项,当任何依赖项更改时,该对象即无效,并从缓存中移除。如果没有依赖项,则此参数可以设置为null。
absoluteExpiration:过期的绝对时间。
slidingExpiration:最后一次访问所添加对象时与该对象过期时之间的时间间隔。
priority:缓存的优先级,由CacheItemPriority枚举表示。缓存的优先级共有6种,从高到低依次是NotRemoveable、High、AboveNormal、Normal、BelowNormal和Low。
OnRemoveCallback:在从缓存中移除对象时所调用的委托(如果没有,可以设置为null)。当从缓存中删除应用程序的对象时,它将会被调用。
Insert方法声明与Add方法类似,但Insert方法为可重载方法。其结构如表1所示。

表1 Insert重载方法列表
Insert方法中,CacheDependency是指依赖关系,DateTime是有效时间,TimeSpan是创建对象的时间间隔。
下面通过示例来讲解Insert方法的使用。
例如,将文件中的xml数据插入缓存,在以后请求时无需从文件读取该数据。Cache Dependency的作用是确保缓存在文件更改后立即到期,以便可以从文件中提取最新数据,重新进行缓存。如果缓存的数据来自若干个文件,还可以指定一个文件名的数组。代码如下:
Cache.Insert("key", myXMLFileData, new
System.Web.Caching.CacheDependency(Server.MapPath("users.xml")));
例如,插入键值为 key 的第二个数据块(取决于是否存在第一个数据块)。如果缓存中不存在名为key的键,或者与该键相关联的项已到期或被更新,那么dependentkey 的缓存条目将到期。代码如下:
Cache.Insert("dependentkey", myDependentData, new
System.Web.Caching.CacheDependency(new string[] {}, new string[]
{"key"}));
下面是一个绝对到期的示例,此示例将对受时间影响的数据缓存1min,1min过后,缓存将到期。
注意:绝对到期和滑动到期不能一起使用。
程序代码如下:
Cache.Insert("key", myTimeSensitiveData, null,
DateTime.Now.AddMinutes(1), TimeSpan.Zero);
下面是一个绝对滑动到期的示例,此示例将缓存一些频繁使用的数据。数据将在缓存中一直保留,除非数据未被引用的时间达到了1min。代码如下:
Cache.Insert("key", myFrequentlyAccessedData, null,
System.Web.Caching.Cache.NoAbsoluteExpiration,
TimeSpan.FromMinutes(1));