分布式二级缓存组件
简介
分布式二级缓存组件,本地缓存支持二级,远端控制协调版本,可避免集中式缓存的IO开销,尤其是在异地部署同一个应用时候,能避免跨区域通信,提高缓存时效和可用性;
适用场景
1、当参数(业务参数、系统参数)需要被多个应用实例进行缓存到本地时候,可以使用本组件;
2、单个应用云上分布式部署时候,需要保证各个实例缓存的参数都要最新,可以使用本组件;
架构设计
关键设计
数据结构:Map<String, List<Map<String, Object>>>,两个String分别存储表名和字段名。
版本号:用于解决多个工程之间,数据一致性问题。
Cache:控制手动或定时刷新缓存;提供接口,通过表名获取数据;提供接口,通过字段过滤数据;提供二级缓存,数据查询后存入二级缓存,下次查询更加快捷。
Redis:用于和Redis数据库交互,获取或更新版本信息;提供锁机制,保证多个工程之间更新版本信息时互不影响。
acc-params-query:提供数据查询接口,数据结构Map<String, List<Map<String, Object>>>
xxx.png
交互方式
第一步:当数据库数据更新时,需通知Redis数据库,更新远程版本号(使用唯一的key值,一般使用工程名、系统名、类型等拼接组成)。
第二步:缓存组件定时(或手动)向Redis数据库获取远程版本号,和本地版本号进行对比,若版本相同,则说明本地数据为最新数据,无需更新;若本地版本与远程版本不同,则需更新本地数据,缓存会向数据请求接口发送获取数据请求,返回最新数据存入本地缓存,同时清空二级缓存。
第三步:主工程(父容器)向缓存组件发起查询请求后,缓存组件根据查询条件(表名、字段名等)首先到二级缓存查询对应数据,如果有相应的数据,则直接返回;若无相应数据,则到本地缓存中获取相应数据后返回,并将该数据写入二级缓存。
Maven依赖
<!--依赖缓存组件,加载缓存数据-->
<dependency>
<groupId>com.xxx.cache</groupId>
<artifactId>tw-cache</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
配置信息
# 产品名称
zcRedis.key.productCode=xxx
# 系统名称
zcRedis.key.systemName=cache
# 系统名(用于区分使用缓存组件的各个系统)
cache.system.name=xxx
# accParams
# 查询服务地址,通过系统名获取对应若干张表数据
cache.paramServer.url=http://xxx/xxx/queryCashData
# 定时任务
cache.refresh.job.schedule=0 0/5 * * * ?
接口
常用接口有:
1、获取当前类型的所有参数
List<T> getParamList(Class<T> paramClass)
2、根据条件返回单个对象
T getParamObject(Class<T> paramClass, Map<String, Object> filters)
3、获取当前类型的所有参数,优先走本地二级缓存
List<T> getParamList(Class<T> paramClass, Map<String, Object> filters)
使用示例
List<Map<String,Object>> tableData = ParamsCache.getParamList(GlobalKeyEnum.T_OUTMAP_INF.getTableName(),hashMap);
....