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

Posted HK Zhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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: 支持泛型keyvalue的缓存接口与实现,其内部通过封装ICache对象实现。通过CacheExtension中的方法可以方便的将ICache对象转换为 ITypedCache对象。

ITypeCache是ICache的包装器,提供类型安全、泛型的cache。为了将ICache转为ITypedCache,我们可以使用AsTyped扩展方法

技术分享

 

 

CacheExtension,封装了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。第一次请求时会创建缓存,以后都是返回相同的缓存对象。因此,我们可以在不同的类(客户端)中共享具有相同名字的相同缓存。

技术分享

 

AbpMemoryCache:通过CLRMemoryCache来实现Icache.

技术分享

 

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

技术分享

 

以上是关于ABP源码分析十三:缓存Cache实现的主要内容,如果未能解决你的问题,请参考以下文章

[Abp 源码分析]模块配置

Mybatis源码分析之Cache二级缓存原理

Guava 源码分析之Cache的实现原理

MyBatis源码分析五MyBatis的缓存

MyBatis源码分析五MyBatis的缓存

Guava Cache 实现与源码分析