咖喱碗糕`

`∧ ∧︵
ミ^ō^ミ灬)~ ~我是只可爱的狐狸```
http://freedom2130.cnblogs.com
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

使用委托进行高级ASP.NET缓存处理

Posted on 2005-12-05 03:58  刹那间我存在  阅读(490)  评论(0编辑  收藏  举报

ASP.NET内建强大缓存功能,你可通过缓存对象的“键与项”(Key and Item)数据访问模型来使用这种功能。该模型非常直观,也是大家所熟悉的。使用这种模型,可以自然地编写出使用缓存对象的代码,如同平时使用一个集合那样。

另外,还可根据键来搜索缓存数据。而且如果一个键不存在,便表明需要从一个数据存储(而不是从缓存)检索数据。较高级的开发者会将缓存行为封装到自己编写的数据检索方法中,但他们仍需依赖一个键是否缺失来确定代码是需要检索数据,还是直接返回缓存的拷贝。

然而,一种更出色数据缓存技术利用了.NET框架中使用的通用异步编程模式。利用这种技术,可让缓存引擎告诉你何时需要检索过期的数据。

委托缓存代理

为了使用这种技术,首先需要声明CacheItemRemovedCallback类型的一个委托变量,如以下C#代码所示。

CacheItemRemovedCallback onRemove = null;

委托的本质就是类型安全的函数指针,用于存储一个方法的地址,便于以后执行该方法。在异步编程中,以及在需要松散耦合通信的任何情况中(比如事件处理代码),委托都得到了普遍应用。如果想了解委托的详情,建议阅读《使用委托(Delegate)实现回调通知》。

接着创建一个方法,它具有针对CacheItemRemovedCallback委托的一个恰当的签名,以便在这个方法中放置用于检索缓存数据的代码:

public void RemovedProducts(string k, Object v, CacheItemRemovedReason r)
{
// Go get the data again
}

该回调方法接受的参数包括:要删除的项的键、项本身以及从缓存中删除项的原因。这些原因封装在CacheItemRemovedReason枚举中,可选的值包括Expired(已过期)、Removed(已移除)、Underused(需要移除以释放内存)以及DependencyChanged(依赖项已更改)。前两个值不需要进一步解释,但要注意第三个值。如果ASP.NET需要回收内存并将项从缓存中移除,就会发生这种情况。下一节将讨论第四个值。

最后一步是声明CacheItemRemovedCallback委托的一个实例,并在向缓冲中添加项时,将该实例传给Insert方法。为了缓存名为dt的一个DataTable(该数据表有一个Products键值),并设置一个6小时的截止期限,可使用以下代码:

onRemove = new CacheItemRemovedCallback(this.RemovedProducts);

this.Cache.Insert("Products", dt, null,
DateTime.Now.AddHours(6), TimeSpan.Zero,
CacheItemPriority.High, onRemove);

以后不管由于什么原因,一旦和Products键关联的值被移除,缓存引擎就会调用委托函数RemovedProducts。如果DataTable因为到期而从缓存中移除,就会在调用RemovedProducts时,向其传递值为Expired的一个解释移除原因的参数。这意味着你需要刷新数据并重新缓存它。

跟踪缓存的依赖对象

就像CacheItemRemovedCallback枚举的DependencyChanged成员所暗示的那样,ASP.NET缓存引擎能跟踪缓存项和其他元素之间的依赖性。依赖性既可在缓存中的两个项之间建立,也可在缓存项和一个文件系统对象(比如文件、目录或者两者的一个组合)之间建立。例如,以下VB.NET代码段将缓存中的一个项引用为Parent,另一个项引用为Child,从而建立了两者的依赖关系。

Me.Cache("Parent") = "parent data"
Dim dependencyKey(0) As String dependencyKey(0) = "Parent"
Dim dep As new CacheDependency(Nothing, dependencyKey)
Me.Cache.Insert("Child", "child data", dep)

Parent项从缓存中移除后,Child项也会移除。综合使用它以及前面介绍的委托机制,就可以获得一个复杂的缓存系统,它完全由相关对象的分组构成。这些对象在你的应用程序缓存中到期之后,还能自动刷新。