(一) 缓存架构
这是官方文档的架构图,图中Cache引用了BackgroundScheduler与实际的有些异议,可以和我自己画的结合起来看。
客户端通过CacheManagerFactory获取配置文件所配置的CacheManager,CacheManager中引用了3个对象,Cache,ExpirationPollTimer,BackgroundScheduler,
Ø Cache是真正的缓存类,用于缓存项目的Add,Remove,并通过IBackingStore获取数据GetData,和保存数据Flush。Cache中保存的是CacheItem,CacheItem引用了ICacheItemExpition和ICahceItemRefreshAction,ICacheItemExpition用于缓存项目的过期策略,是否过期,过期时间等。ICahceItemRefreshAction用户缓存项目的刷新。
Ø CacheManager引用的ExpirationPollTimer通过一个Timer调用回调方法,调用BackgroundScheduler中的ExpirationTask的DoExpirations查找过期项,移除过期项
Ø ExpirationTask和ScavengerTask都引用了ICacheOperations,ICacheOperations用于缓存项目过期后缓存项目的操作,ScavengerTask用于标识缓存项目是否需要获取
(二) 缓存配置
<configuration>
<configSections>
<section name="cachingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Caching.Configuration.CacheManagerSettings,Microsoft.Practices.EnterpriseLibrary.Caching" />
</configSections>
<cachingConfiguration defaultCacheManager="Default Cache Manager">
<backingStores>
<add name="inMemory"
type="Microsoft.Practices.EnterpriseLibrary.Caching.BackingStoreImplementations.NullBackingStore, Microsoft.Practices.EnterpriseLibrary.Caching" />
</backingStores>
<cacheManagers>
<add name="Default Cache Manager"
type="Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager, Microsoft.Practices.EnterpriseLibrary.Caching"
expirationPollFrequencyInSeconds="60"
maximumElementsInCacheBeforeScavenging="1000"
numberToRemoveWhenScavenging="10"
backingStoreName="inMemory" />
<add name="Loading Scenario Cache Manager"
type="Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager, Microsoft.Practices.EnterpriseLibrary.Caching"
expirationPollFrequencyInSeconds="60"
maximumElementsInCacheBeforeScavenging="1000"
numberToRemoveWhenScavenging="10"
backingStoreName="inMemory" />
</cacheManagers>
</cachingConfiguration>
</configuration>
(三) 缓存使用
//获取默认的缓存配置
ICacheManager primitivesCache;
primitivesCache = CacheFactory.GetCacheManager();
cache.Add()…
cache.Remove()…
或者获取指定的缓存配置
readonly ICacheManager cache;
cache = CacheFactory.GetCacheManager("Loading Scenario Cache Manager");
cache.Add()…
cache.Remove()…