缓存应用程序块简介
Enterprise Library Caching Application Block 1.0 版可让开发人员将本地缓存集成到其应用程序中。它支持内存缓存和后备存储(可选),后者可以是企业程序库数据访问应用程序块或独立存储。应用程序块无需修改即可使用,它还可以提供检索、添加和删除缓存数据所需的全部功能。可配置的过期时间与清除策略也是应用程序块的一部分功能。
在构建企业级分布式应用程序时,架构师和开发人员面临着许多难题。缓存可以帮助您克服其中的一些难题,包括:
•性能。通过存储与数据使用者尽可能接近的相关数据,缓存可以提高应用程序的性能。这样可以避免重复进行数据创建、处理和传输。
•可伸缩性。在缓存中存储信息有助于节省资源,并且可以随着应用程序需求的增加来提高可伸缩性。
•可用性。通过将数据存储在本地缓存中,应用程序可以承受系统的故障,例如网络等待时间、Web 服务问题以及硬件故障。
常见情况
缓存应用程序块适用于以下任何一种情况:
•必须重复访问静态数据或极少更改的数据。
•在创建、访问或传输方面,数据访问的开销很高。
•即使在源(例如服务器)不可用时,数据也必须始终可用。
缓存应用程序块可用于以下任何一个应用程序类型:
•Windows 窗体
•控制台
•Windows 服务
•企业服务
•ASP.NET Web 应用程序或 Web 服务(如果您需要 ASP.NET 缓存中未包含的功能)
应该将缓存应用程序块部署在单个应用程序域中。每个应用程序域都可以有一个或多个缓存(可以有也可以没有后备存储)。缓存不能在不同的应用程序域之间共享。
缓存应用程序块的性能已优化,并且是线程安全和异常安全的。您可以对它进行扩展,以包括您自己的过期策略和后备存储。
读者要求
该应用程序块是专为软件架构师和软件开发人员设计的。要充分利用该指导,您应该了解以下技术:
•Microsoft Visual C# 开发工具或 Microsoft Visual Basic 开发系统
•.NET Framework
1.0 版的主要特点
Enterprise Library Caching Application Block 1.0 版包含以下新功能:
•可以使用图形工具(即,企业程序库配置控制台)来管理配置设置。
•可以使用独立存储或企业程序库数据访问应用程序块来配置永久存储位置,它的状态与内存缓存同步。
•可以通过创建自定义过期策略和存储位置来扩展应用程序块。
•可以获得应用程序块以线程安全的方式执行的担保。
系统要求
要使用缓存应用程序块来开发应用程序,您需要以下软件:
•Microsoft Windows 2000、Windows XP Professional 或 Windows Server 2003 操作系统
•Microsoft .NET Framework 1.1
•Microsoft Visual Studio .NET 2003
缓存应用程序块依赖于其他应用程序块和企业程序库中包含的代码:
•配置应用程序块。缓存应用程序块使用该块来读取其配置信息。
•通用程序库功能。规范就是这样一个示例;它为公开用于系统管理的事件和数据提供各种功能。
•数据访问应用程序块。如果您要将数据库用作后备存储,则需要该应用程序块。
此外,应用程序块还使用 XML 文件来存储配置信息。修改该信息的推荐方法是使用企业程序库配置控制台。
缓存应用程序块的设计
缓存应用程序块旨在实现以下目标:
•提供一组大小可以管理的 API
•允许开发人员将标准的缓存操作集成到其应用程序中,而无需了解应用程序块的内部工作方式
•可以使用企业程序库配置控制台轻松地进行配置
•可以高效执行
•线程安全
•如果在访问后备存储时发生异常,可以确保后备存储不会受到影响
•确保内存缓存的状态与后备存储的状态保持同步
设计要点
图 1 展示了缓存应用程序块中关键类的相互关系。

图 1.缓存应用程序块的设计
当使用 CacheFactory 初始化 CacheManager 的实例时,它会在内部创建一个 CacheManagerFactory 对象,而该对象又会创建一个 Cache 对象。创建 Cache 对象后,后备存储中的所有数据就会加载到一个内存表示中,该表示包含在 Cache 对象中。然后,应用程序可以请求 CacheManager 对象检索缓存数据、将数据添加到缓存中,以及从缓存中删除数据。
当应用程序使用 GetData 方法向 CacheManager 对象发送检索某项的请求时,CacheManager 对象就会将该请求转发给 Cache 对象。如果该项在缓存中,它就会从缓存的内存表示中返回到应用程序。如果它不在缓存中,该请求会返回 NULL。如果该项位于缓存中但已过期,它也会返回 NULL。
当应用程序使用 Add 方法向 CacheManager 对象发送向缓存添加某项的请求时,CacheManager 对象同样会将该请求转发给 Cache 对象。如果已经有一个具有相同关键字的项,则在将新项添加到内存存储和后备存储中之前,Cache 对象会首先删除它。如果后备存储是默认的后备存储 NullBackingStore,则数据只写到内存中。在添加项时,如果缓存项的数量超过预定的限制,那么 BackgroundScheduler 对象就开始进行清理。在添加项时,应用程序可以使用 Add 方法的重载来指定过期策略数组、清除的优先级,以及实现 ICacheItemRefreshAction 接口的对象。还可以使用该对象来刷新缓存中的过期项。
BackgroundScheduler 对象周期性地监视缓存中各项的生存期。当某个项过期时,BackgroundScheduler 对象会首先删除它,然后再通知应用程序该项已被删除(可选)。此时,由应用程序负责刷新缓存。
测试驱动
开发缓存应用程序块的目的是,分析常见的企业开发难题以及提出针对这些难题的成功解决方案。然而,因为每个应用程序都是唯一的,所以您会发现该应用程序块并不适合每个应用程序。为了评估该应用程序块并确定它对您项目的适用性,Microsoft 建议您至少用半天的时间来研究该应用程序块。推荐的评估方法,如下:
1. 下载企业程序库。
2. 安装企业程序库,并编译所有的应用程序块和工具。
3. 阅读文档的“Introduction”和“Scenarios and Goals”部分。
4. 编译并运行快速入门示例,然后通读文档中相关的“QuickStart Walkthroughs”和“Key Scenarios”部分。
5. 如果应用程序块看起来很适合您的应用程序,则尝试使用该应用程序块在您的应用程序或丢弃原型 (throw-away prototype) 应用程序中实现一个简单的用例。