Fork me on GitHub

ABP源码分析十三:缓存Cache实现

ABP中有两种cache的实现方式:MemroyCache 和 RedisCache. 如下图,两者都继承至ICache接口(准确说是CacheBase抽象类)。ABP核心模块封装了MemroyCache 来实现ABP中的默认缓存功能。 Abp.RedisCache这个模块封装RedisCache来实现缓存(通过StackExchange.Redis这个类库访问redis)。

 

 

ICache:缓存的接口。以string类型的key缓存object类型的value.ICache.Get方法有两个参数:

•key:缓存中一个条目的键(字符串类型)。

•工厂:没有找到指定key的缓存条目时调用传入的action来创建cache。工厂方法应该创建并返回实际的条目。如果给定的key在缓存中找到了,那么不会调用该action。

ICache接口也有像GetOrDefault,Set,Remove,Clear的方法。同时,这些方法也有异步(async)版本。

 

ITypedCache/TypedCacheWrapper: 支持泛型key和value的缓存接口与实现,其内部通过封装ICache实例和CacheExtension定义的对ICache的扩展方法来是实现泛型版本的Icache.


另外通过CacheExtension中的方法可以方便的将ICache对象转换为 ITypedCache对象。 ITypeCache是ICache的包装器,提供类型安全、泛型的cache。为了将ICache转为ITypedCache,我们可以使用AsTyped扩展方法.

 

 

CacheExtension: 定义了ICache的扩展方法. 最关键的是如下两个支持泛型的方法:GetOrDefault和GetOrDefaultAsync。如下,内部调用ICache实例的相应方法并通过类型转换。

 

 

AbpCacheNames:定义了四个cachekey常量,这几个cache是供ABP框架使用的

 

ICacheConfigurator/CacheConfigurator:封装了cachename和对该cahce的初始化方法,通过初始化方法可以完成对cache的配置(比如过期时间)。

 

 

ICachingConfiguration/CachingConfiguration: 该接口提供完成cache的配置的方法。具体是通过封装了一个ICacheConfigurator集合,并调用其上面的InitAction来配置cache

 

ICacheManager/CacheManagerBase: 该接口和实现用于生成,配置以及销毁ICache实例。具体是通过ICachingConfiguration对象来初始化cache, 并通过ConcurrentDictionary<string, ICache>来存放和管理cache.

 

ICacheManager.GetCache方法返回一个ICache。第一次请求时会创建缓存,并通过CachingConfiguration中的CacheConfigurator完成对该Cache的配置,以后都是返回相同的缓存对象。因此,我们可以在不同的类(客户端)中共享具有相同名字的相同缓存。

 

AbpMemoryCache:通过CLRMemoryCache来实现Icache.

 

AbpMemoryCacheManager:重写了CacheManagerBaseCreateCacheImplementation方法,该方法用于创建真实的Icache对象。 具体到AbpMemoryCacheManager就是创建AbpMemoryCache

 

AbpRedisCacheManager:重写了CacheManagerBaseCreateCacheImplementation方法,该方法用于创建真实的Icache对象。 具体到AbpRedisCacheManager就是创建AbpRedisCache

IAbpRedisConnectionProvider/AbpRedisConnectionProvider:web.config中读取Redisconnectionstring信息,并通过connectionstring生成ConnectionMultiplexer对象。AbpRedisConnectionProvider是一个单例实现,并且将ConnectionMultiplexer对象保存在其本地的Dictionary中,避免反复创建。

AbpRedisCache:实现了从Redis数据库读取数据的功能。具体则是通过IAbpRedisConnectionProvider对象来访问redis数据库。

 

返回ABP源码分析系列文章目录

posted @ 2016-03-28 12:18 ZHK的博客 阅读(...) 评论(...) 编辑 收藏