Enterprise Library: Caching Application Block概述
Enterprise Library: Caching Application Block概述
Written by: Rickie Lee (rickieleemail#yahoo.com)
My blog:http://www.cnblogs.com/rickie
Enterprise Library中Caching Application Block允许开发人员在应用程序中采用本地缓存(Cache),它支持内存缓存和可选的辅助存储器(Enterprise Library Data Access Application Block或隔离的存储器(Isolated storage))。该Application Block提供了检索、增加和删除缓存数据的所有功能,还包括可配置的有效期和清除策略(Expiration and Scavenging Policies)。
在创建企业级分布式应用程序时,架构师和开发人员经常面临许多挑战,缓存技术可以帮助克服如下一些挑战:
- 性能(Performance):通过存储相关的数据尽可能靠近数据消费者,缓存提供了应用程序的性能。这样可以避免重复的数据创建、处理和传输。
- 可扩展性(Scalability):随着应用程序需求的增加,缓存信息有助于节省资源并提高可扩展性。
- 可用性(Availability):通过存储数据在本地缓存中,应用程序可以幸免于系统故障,如网络延迟、Web Service问题和硬件故障等等。
Caching Application Block适用于如下情况:
- 必须重复访问静态数据或很少改变的数据。
- 数据访问在创建、访问或传输方法代价高昂。
- 数据必须总是可以访问,即使当源服务器不能访问。
另外,Caching Application Block可以在如下的应用程序类型中采用:Windows Forms, Console Application, Windows Services, COM+ Server和ASP.NET Web Application and Web Service(如果需要使用ASP.NET cache不包含的特性和功能)。
Caching Application Block必须部署在单一应用程序域内,每一个应用程序域可以有一个多多个缓存,缓存不能在不同应用程序域之间共享。Caching Application Block性能优化且线程安全和异常安全(Exception Safe),你可以通过定制有效期策略和辅助存储器来进行扩展。
配置Caching Application Block
(1)通过Configuration Console配置管理工具添加Caching Application Block,默认会创建一个Cache Manager,可以根据需要创建多个Cache Manager。
(2)这里将Cache Manager改名为Default Cache Manager,并将Caching Application Block节点的DefaultCacheManager属性设置为Default Cache Manager。
(3)选择Default Cache Manager,右侧面板显示对应的属性及其属性值。
ExpirationPollFrequencyInSeconds:设置BackgroundScheduler轮询过期数据项的频率(单位:秒),缺省值60秒。
MaximumElementsInCacheBeforeScavenging:设置在开始清除缓存中数据项之前,缓存中可以包含的最多数据项,默认值为1000。
Name:Cache Manager的名称。
NumberToRemoveWhenScavenging:设置在每次开始清除缓存中数据项时,清除的数据项,默认值为10。
(4)选择Default Cache Manager,添加或设置Cache Storage。默认情况下,仅将数据项缓存在内存中,并设置辅助存储器(Backing Storage)的属性值为NullBackingStore。你也可以设置Backing Storage为Data Cache Storage或Isolated Storage。
Data Cache Storage使用Data Access Application作为Database Provider,并将缓存数据存放在数据库中。Caching Application Block中提供了如下SQL SCRIPT用来创建相应的数据库Schema:
C:\Program Files\Microsoft Enterprise Library\src\Caching\Scripts\CreateCachingDb.cmd
Caching Application Block的Configuration Console界面如下:
Proactive loading和Reactive loading
将数据缓存可以提供应用程序的性能,如下有2种方式来装载数据到缓存中:
Proactive loading:该方法首先检索所有需要的数据,然后在应用程序或进程整个生命期内缓存数据。
Reactive loading:该方法根据应用程序的需要检索必要的数据,然后将数据存放在缓存中,用于将来的请求。
关于Proactive loading和Reactive loading的优缺点及适用情况,可以参考Caching Application Block中的Loading the Cache文档。
调用Caching Application Block的代码片断
首先需要引用Microsoft.Practices.EnterpriseLibrary.Caching.dll,并在代码中添加:
using Microsoft.Practices.EnterpriseLibrary.Caching;
(1)添加数据项到缓存
private CacheManager primitivesCache;
// Use the default cache manager for the primitive operations
this.primitivesCache = CacheFactory.GetCacheManager();
// 创建缓存数据项
Product product = new Product(
this.enterNewItemForm.ProductID,
this.enterNewItemForm.ProductShortName,
this.enterNewItemForm.ProductPrice);
// 调用CacheManager的Add方法
primitivesCache.Add(product.ProductID, product);
上述代码调用CacheManager.Add(key, value)方法,将数据项放入缓存,这是Add方法一个比较简单的重载。该Add方法添加的数据项不会过期,并且设置CacheItemPriority属性为Normal。
如果缓存中已经存在相同key的数据项,则先移除现有数据项,然后添加新的数据项。如果在整个处理过程中出现异常,则缓存保持原样。
此外,CacheManager.Add方法还有如下重载:
public void Add(
string key,
object value,
CacheItemPriority scavengingPriority,
ICacheItemRefreshAction refreshAction,
params ICacheItemExpiration[] expirations
);
scavengingPriority 指定新数据项的scavenging优先级。
refreshAction:该对象允许更新缓存中过期数据项。
expirations:Param数组指定该数据项的有效期策略,可以为null或忽略。
(2)将数据项移出缓存
// Request that the item be removed from the cache.
this.primitivesCache.Remove(product.ProductID);
如果该item不在缓存中,该Remove方法什么都不做。
(3)从缓存中检索数据
// Read the item from the cache. If the item is not found in the cache, the
// return value will be null.
Product product = (Product) this.primitivesCache.GetData(product.ProductID);
如果缓存中不存在该item,则返回null值。
(4)清除所有缓存数据
this.primitivesCache.Flush();
清除缓存中所有数据。
***
作者:Rickie Lee (rickieleemail#yahoo.com)
本文参考Microsoft Enterprise Library中Caching Application Block文档及其QuickStart。
References:
1. Microsoft Enterprise Library: Caching Application Block.
2. Rickie, Microsoft patterns & practices Enterprise Library January 2005 [中文稿], http://www.cnblogs.com/rickie/archive/2005/01/30/99443.html
3. Rickie, Enterprise Library released! http://www.cnblogs.com/rickie/archive/2005/01/29/99106.html