应用程序数据缓存
应用程序数据缓存的主要功能是在内存中存储各种与应用程序相关的对象,它主要由Cache类实现,该类从属于System.Web.Caching命名空间,其实例对象为每个应用程序所专用。通过对Cache类的应用,可轻松实现添加、检索和移除应用程序数据缓存,以及移除缓存项时通知应用程序等功能。
添加应用程序数据缓存对象
向应用程序缓存添加项的三种方式:1.通过键和值直接设置项,向缓存添加项;2.使用Insert 方法向缓存添加项;3.使用 Add 方法向缓存添加项。
1.通过键和值直接设置项,向缓存添加项
下面的代码示例将名为 CacheItem1 的项添加到 Cache 对象中:
Cache["CacheItem1"] = "Cached Item 1";
2.通过使用 Insert 方法将项添加到缓存中
Cache.Insert 方法有四种重载方式,下面将用示例代码来说明Insert方法。
重载一:public void Insert (string key, Object value)
向 Cache 对象插入项,该项带有一个缓存键引用其位置,并使用 CacheItemPriority 枚举提供的默认值。
参数:key:用于引用该项的缓存键。
value:要插入缓存中的对象。
示例代码:Cache.Insert("DSN", connectionString);
重载二:public void Insert (string key, Object value, CacheDependency dependencies)
向 Cache 中插入具有文件依赖项或键依赖项的对象。
参数:key:用于标识该项的缓存键。
value:要插入缓存中的对象。
dependencies:所插入对象的文件依赖项或缓存键依赖项。当任何依赖项更改时,该对象即无效,并从缓存中移除。如果没有依赖项,则此参数包含空引用。
示例代码:Cache.Insert("DSN", connectionString, new CacheDependency(Server.MapPath("myconfig.xml")));
重载三:public void Insert (string key, Object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration)
向 Cache 中插入具有依赖项和过期策略的对象。
参数:key:用于引用该对象的缓存键。
value:要插入缓存中的对象。
dependencies:所插入对象的文件依赖项或缓存键依赖项。当任何依赖项更改时,该对象即无效,并从缓存中移除。如果没有依赖项,则此参数包含空引用。
absoluteExpiration:所插入对象将过期并被从缓存中移除的时间。如果使用绝对过期,则 slidingExpiration 参数必须为 NoSlidingExpiration。
slidingExpiration:最后一次访问所插入对象时与该对象过期时之间的时间间隔。如果该值等效于 20 分钟,则对象在最后一次被访问 20 分钟之后将过期并被从缓存中移除。如果使用可调过期,则 absoluteExpiration 参数必须为NoAbsoluteExpiration。
示例代码:Cache.Insert("DSN", connectionString, null, DateTime.Now.AddMinutes(2), TimeSpan.Zero);
重载四:public void Insert (string key, Object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback)
向 Cache 对象中插入对象,后者具有依赖项、过期和优先级策略以及一个委托(可用于在从 Cache 移除插入项时通知应用程序)。
参数:key:用于引用该对象的缓存键。
value:要插入缓存中的对象。
dependencies:该项的文件依赖项或缓存键依赖项。当任何依赖项更改时,该对象即无效,并从缓存中移除。如果没有依赖项,则此参数包含 空引用。
absoluteExpiration:所插入对象将过期并被从缓存中移除的时间。如果使用绝对过期,则 slidingExpiration 参数必须为 NoSlidingExpiration。
slidingExpiration:最后一次访问所插入对象时与该对象过期时之间的时间间隔。如果该值等效于 20 分钟,则对象在最后一次被访问 20 分钟之后将过期并被从缓存中移除。如果使用可调过期,则 absoluteExpiration 参数必须为NoAbsoluteExpiration。
priority:该对象相对于缓存中存储的其他项的成本,由 CacheItemPriority 枚举表示。该值由缓存在退出对象时使用;具有较低成本的对象在具有较高成本的对象之前被从缓存移除。
onRemoveCallback:在从缓存中移除对象时将调用的委托(如果提供)。当从缓存中删除应用程序的对象时,可使用它来通知应用程序。
示例代码:Cache.Insert("DSN", connectionString, null, DateTime.Now.AddMinutes(2), TimeSpan.Zero, CacheItemPriority.High, onRemove);
3.使用Add 方法向缓存添加项
public Object Add (string key, Object value, CacheDependency dependencies, DateTime absoluteExpiration,
TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback)
参数:key:用于引用该项的缓存键。
value:要添加到缓存的项。
dependencies:该项的文件依赖项或缓存键依赖项。当任何依赖项更改时,该对象即无效,并从缓存中移除。如果没有依赖项,则此参数包含空引用。
absoluteExpiration:所添加对象将过期并被从缓存中移除的时间。如果使用可调过期,则 absoluteExpiration 参数必须为 NoAbsoluteExpiration。
slidingExpiration:最后一次访问所添加对象时与该对象过期时之间的时间间隔。如果该值等效于 20 分钟,则对象在最后一次被访问 20 分钟之后将过期并从缓存中移除。如果使用绝对过期,则 slidingExpiration 参数必须为 NoSlidingExpiration。
priority:对象的相对成本,由 CacheItemPriority 枚举表示。缓存在退出对象时使用该值;具有较低成本的对象在具有较高成本的对象之前被从缓存移除。
onRemoveCallback:在从缓存中移除对象时所调用的委托(如果提供)。当从缓存中删除应用程序的对象时,可使用它来通知应用程序。
Add方法与Insert方法比较:Insert方法的返回值为空,Add方法返回缓存项的数据对象,Insert方法有4个重载方法,较灵活;如果缓存中已经存在与现有项同名的项,Insert方法替换该项,而Add方法不会替换该项,并且不会引发异常。
检索缓存项的值
1.指定键名检索指定项
通过在 Cache 对象中进行检查来确定该项是否不为 null(在 Visual Basic 中为 Nothing)。如果该项存在,则将它分配给变量。否则,重新创建该项,将它添加到缓存中,然后访问它。
下面的代码示例演示如何从缓存中检索名为 CacheItem 的项。代码将该项的内容分配给名为 cachedString 的变量。如果该项不在缓存中,则代码会将它添加到缓存中,然后将它分配给 cachedString。
2.用Get方法检索指定项
public Object Get (string key)
参数:key:要检索的缓存项的标识符。
返回值:检索到的缓存项,未找到该键时为空引用。
示例代码:Cache.Get("MyTextBox.Value");
3.使用GetEnumerator方法检索指定项
GetEnumerator方法的功能是检索用于循环访问包含在缓存中的键设置及其值的字典枚举数。
public IDictionaryEnumerator GetEnumerator ()
它的返回值是要循环访问 Cache 对象的枚举数。此方法枚举所有项的同时,可以将项添加到缓存或从缓存移除项。
下面的示例使用 GetEnumerator 方法创建一个 IDictionaryEnumerator 对象 CacheEnum。枚举数在整个缓存中运行一遍,将各缓存项的值转换成字符串,然后将这些值写入“Web 窗体”页。
从 ASP.NET 缓存中删除项
ASP.NET 缓存中的数据是易失的,即不能永久保存。由于以下任一原因,缓存中的数据可能会自动移除:
缓存已满。
该项已过期。
依赖项发生更改。
从缓存中显式删除项
调用 Remove 方法,以传递要移除的项的键。
下面的示例演示如何移除键为 MyData1 的项。
Cache.Remove("MyData1");