本文介绍前文《JAD-CACHE缓存框架,架构设计篇》设计的JAD-CACHE框架的基础上进一步介绍 JAD-CACHE如果实现本地缓存以及集成EhCache。
1、实现本地缓存
Spring自带的cache模块本身内置了一个用Map实现的本地缓存。但因为功能比较简单,JAD-CACHE对它进行了扩展,如下类图:
上图中,上面一排都是JAD-CACHE的抽象实现类,在前文已经介绍过了,本地缓存的实现,主要是下面一排的三个实现类。
图中LocalMapCache类就是Cache接口的实现类,它继承于JadAbstractCacheManager,拥有父类的可被CacheClient管理、支持缓存null值、支持差异化存活时间等特性。而它本身对于缓存数据的实现是通过它自身维护的ConcurrentMap列表来实现的。
在JAD-CACHE架构设计中,每一个Cache实例都会被一个CacheClient管理,对于LocalMapCache,管理它的CacheClient就是SimpleLocalCacheClient实例。SimpleLocalCacheClient是AbstractCacheClient的子类,它实现的父类的抽象方法registryCacheManager(),在它被初始化的过程中,注册一个SimpleLocalCacheManager实例,作为它控制的CacheManager(因为JAD-CACHE框架要求每一个CacheClient实例中都持有一个CacheManager类型的引用)。SimpleLocalCacheManager类从JAD-CACHE框架中的JadAbstractCacheManager类继承,并实现了getMissingCache(string),在这个getMissingCache()方法,实现了跟据参数决定是否需要自动创建Cache的逻辑。这使得,开发人员在需要使用某个Cache时,不需要事先配置,只需要使定它的autoCreateCache属性为true就可以自动创建Cache了。
因为SimpleLocalCacheManager类是SimpleLocalCacheClient实例在初始化的时候自动创建并注入的,所以这个实例对于开发人员来说是透明的,开发人员只需配置SimpleLocalCacheClient实例而无需配置SimpleLocalCacheManager,只要控制SimpleLocalCacheClient的启停等状态,就可以通过它自动注入的SimpleLocalCacheManager实例间接的操作缓存。
2、集成EhCache
Spring 缓存模块本身是自带了与 EhCache 集成相关的 CacheManager 实现类。但应功能简单, JAD-CACHE 在这里重新提供了几个新的实现,如下图:上图中JadEhCacheCache是Cache接口的实现类,它包装了Ehcache这个Ehcache厂商实现的缓存对像。它实现了父类lookup(),get(),put()等操作缓存的抽像方法。具体实现逻辑就委托给Ehcache对像通过Ehcache自身的api去操作Ehcache缓存。
JadEhCacheCache实例对像的CacheClient实现类是EhcacheClient类,这个类从AbstractCacheClient继承,除了拥有父类的autoCreateCache等属性外,还有一个configFile属性,这个属性用于配置Ehcache配置文件和名称路径(默认为classpath跟目录下的ehcache.xml)。
JadEhCacheCache实例在初始化的时候,会自动注入一个JadEhCacheCacheManager类型的实例,这个类是JadAbstractCacheManager类的子类,它实现了父类的loadCaches()等方法,在它初始化的时候,会自动加载ehcache.xml配置文件中配置的Cache,而且具备自动创建缺省配置Cache的能力。
JadEhCacheCacheManager是EhcacheClient实例初始化的时候自动注入的,对开发人员人透明,开发人只要配置EhcacheClient实例而无需再配置JadEhCacheCacheManager就可以集成Ehcache了。
3、集成MemCahce
Spring缓存模块并没有提供对MemCache的支持,需要实现,但因MemCache是一个服务器缓存,自身比较复杂。JAD-CACHE采用阿里开源的memcache客户端代码,在它的基础上做了扩展,这里暂不讨论,稍后写一篇文章单独讨论。
目前JAD-CACHE项目已在开源中国码云平台上开源,地址:
https://git.oschina.net/457049726/jad-cache
更多信息,欢迎扫以下二维码关注我的微信公众号: