尽管Application和Cache对象非常相似,主要区别在于Cache对象有拥有更多的特性,像过期策略、缓存依赖。它意味着数据存储在缓存对象可以根据预定义时间或它依赖的实体变化时过期或清楚,而这个特性Application对象是不支持的。
让我们来讨论下它支持的过期策略和缓存的依赖吧。
依赖
依赖意味着缓存的对象会被清除当依赖的实体发生变化时。所以可以定义一个依赖关系当依赖的对象发生变化时清除对应缓存对象。ASP.NET支持了两种依赖对象。
•文件依赖(File Dependency)-它提供了这样一种机制,当磁盘文件无论何时发生变化时自动清除缓存对象。举例来说,我的应用程序使用XML存储错误信息(错误号和错误消息的映射),用错误号来检索错误消息。每次当我想读取错误消息的时候,我不是每次都从磁盘去读取,而是当应用启动的时候将其放到Cache缓存里以便以后检索的时候再用。在程序运行过程中,当我添加新的错误信息或者修改已有的错误信息时,会发生什么情况呢?我需要停止程序运行去修改这些信息吗?根本不用,当做这样修改的时候,Cache缓存中的数据会自动失效,这就是文件缓存依赖。
下面例子显示了如何使用文件缓存来使Cache缓存失效的。所以,无论任何时候对error.xml文件作出修改时,缓存条目都会自动失效。
复制代码 代码如下:
object errorData;
//Load errorData from errors.xml
CacheDependency fileDependency =
new CacheDependency(Server.MapPath("errors.xml"));
Cache.Insert("ERROR_INFO", errorData, fileDependency);
•键依赖(Key Dependency)-键依赖和文件依赖非常相似,唯一的区别在于它不是依赖文件而是依赖其它条目,当Cache依赖的条目发生改变时或被删除时,缓存会自动失效。这种方法对相互依赖的对象增加到缓存中,而且当主对象发生变化时这些相互依赖的缓存对象都要被释放的情况下很有用。例如,员工号、姓名、薪水同时增加到了缓存当中,如果员工号发生了改变或被删除,所有缓存中的员工信息都会被清除。在这个例子中,员工号在员工信息中充当依赖项。
下面例子显示了如何使用键依赖来使缓存失效的。
复制代码 代码如下:
string[] relatedKeys = new string[1];
relatedKeys[0] = "EMP_NUM";
CacheDependency keyDependency = new CacheDependency(null, relatedKeys);
Cache["EMP_NUM"] = 5435;
Cache.Insert("EMP_NAME", "Shubhabrata", keyDependency);
Cache.Insert("EMP_ADDR", "Bhubaneswar", keyDependency);
Cache.Insert("EMP_SAL", "5555USD", keyDependency);
过期策略(Expiration Policy)
过期策略定义了如何以及何时让缓存的对象过期的。
•基于时间的过期(Time based expiration)-基于时间的过期提供了让用户为缓存对象预定义过期的时间。这个预定义时间可以是一个绝对时间如到2005年10月31号12点,或者相对时间,相对于缓存对象的存入时间。
复制代码 代码如下:
//Absolute Expiration
Cache.Insert("EMP_NAME", "Shubhabrata", null,
DateTime.Now.AddDays(1), Cache.NoSlidingExpiration);
//Sliding Expiration
Cache.Insert("EMP_NAME", "Shubhabrata", null,
Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(60));
怎样知道一个缓存对象被清除了?
上面的例子描述了如何清除缓存对象,但有时我们需要知道什么时候对象从缓存中清除。可以,我们通过使用回调来实现。在上面错误信息的例子中,无论任何时候error.xml发生变化时,缓存的对象就会被清除。假设我们想要更新缓存与最新的错误消息。何时从缓存中清除对象,我们可以使用回调(Callback)来做进一步处理(重新加载对象到缓存中)。
下面例子显示了如何在缓存过期时使用回调的场景。
复制代码 代码如下:
private void AddItemsToCache()
{
int empNum = 5435;
CacheItemRemovedCallback onEmpDetailsRemove =
new CacheItemRemovedCallback(EmpDetailsRemoved);
Cache.Insert("EMP_NUM", empNum, null,
Cache.NoAbsoluteExpiration,
Cache.NoSlidingExpiration,
CacheItemPriority.Default,
onEmpDetailsRemove);
}