ABP框架学习记录(11)- 缓存的实现
缓存在 ABP 项目中的路径 ABP/Runtime
:
ABP中实现两种 Cache
:MemroyCache
和 RedisCache
。两者都继承至 ICache
接口(准确说是 CacheBase
抽象类)。ABP核心模块封装了 MemroyCache
来实现ABP中的默认缓存功能。 Abp.RedisCache
这个模块封装 RedisCache
来实现缓存(通过 StackExchange.Redis
这个类库访问redis)
ICache
接口:定义可以按键存储和获取项目的缓存。
ICache
接口中的方法 Get/GetAsync
有两个参数:
key:缓存关键字,字符串类型;
工厂:没有找到指定key的缓存条目时调用传入的action来创建cache。工厂方法应该创建并返回实际的条目。如果给定的key在缓存中找到了,那么不会调用该action。
CacheBase
:提供继承 ICache
接口的抽象类;
CacheExtensions
:提供 ICache
的扩展类:
ICacheManager/CacheManagerBase
:提供缓存管理器;
ICacheManager.GetCache
方法返回一个ICache。第一次请求时会创建缓存,并通过 CachingConfiguration
中的CacheConfigurator
完成对该Cache的配置,以后都是返回相同的缓存对象。因此,我们可以在不同的类(客户端)中共享具有相同名字的相同缓存。
ICachingConfiguration/CachingConfiguration
:用于配置 缓存系统,首先通过在 AbpKernelModule
类,PreInitialize
方法配置缓存:
定义:
ICacheConfigurator/CacheConfigurator
:表示已注册的缓存配置器,定义两个构造函数,其中的参数 Action<ICache> initAction
表示创建的回调函数;
在 AbpKernelModule
类,PreInitialize
方法调用:
CacheManagerExtensions
:提供对 CacheManager
扩展类,提供 GetCache<TKey, TValue>
方法,具体实现调用 CacheExtensions
的 AsTyped<TKey, TValue>
扩展方法;
AsTyped<TKey, TValue>
扩展方法,实例化了一个 TypedCacheWrapper<TKey, TValue>(cache)
类型的对象,并将 CacheManagerExtensions
中扩展方法 GetCache<TKey, TValue>
的 TKey, TValue
,然后继续传递给 CacheExtensions
中的扩展方法 AsTyped<TKey, TValue>
的 TKey, TValue
,最终,在 TypedCacheWrapper
的泛型类中接收,并为其自身的方法提供 TKey, TValue
。
ITypedCache/TypedCacheWrapper/TypedCacheExtensions
:支持泛型key和value的缓存接口与实现,其内部通过封装ICache实例和CacheExtension
定义的对ICache的扩展方法来是实现泛型版本的 Icache
。
AbpMemoryCacheManager
:重写了 CacheManagerBase
的 CreateCacheImplementation
方法,该方法用于创建真实的 Icache
对象。 具体到 AbpMemoryCacheManager
就是创建 AbpMemoryCache
。
AbpMemoryCache
:通过CLR的 MemoryCache
来实现 Icache
。
使用
参考: