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

ZDNet软件频道 时间:2003-04-21 作者:BUILDER.COM |  我要评论()
本文关键词:
ASP.NET内建强大缓存功能,你可通过缓存对象的“键与项”(Key and Item)数据访问模型来使用这种功能。该模型非常直观,也是大家所熟悉的。
本文译自Builder.comASP.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项也会移除。综合使用它以及前面介绍的委托机制,就可以获得一个复杂的缓存系统,它完全由相关对象的分组构成。这些对象在你的应用程序缓存中到期之后,还能自动刷新。



责任编辑:炒饭

欢迎评论或投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134