簡介
分布式二級(jí)緩存組件冠蒋,本地緩存支持二級(jí)羽圃,遠(yuǎn)端控制協(xié)調(diào)版本,可避免集中式緩存的IO開銷抖剿,尤其是在異地部署同一個(gè)應(yīng)用時(shí)候朽寞,能避免跨區(qū)域通信,提高緩存時(shí)效和可用性斩郎;
適用場景
1脑融、當(dāng)參數(shù)(業(yè)務(wù)參數(shù)、系統(tǒng)參數(shù))需要被多個(gè)應(yīng)用實(shí)例進(jìn)行緩存到本地時(shí)候缩宜,可以使用本組件肘迎;
2、單個(gè)應(yīng)用云上分布式部署時(shí)候锻煌,需要保證各個(gè)實(shí)例緩存的參數(shù)都要最新妓布,可以使用本組件;
架構(gòu)設(shè)計(jì)
關(guān)鍵設(shè)計(jì)
數(shù)據(jù)結(jié)構(gòu):Map<String, List<Map<String, Object>>>宋梧,兩個(gè)String分別存儲(chǔ)表名和字段名匣沼。
版本號(hào):用于解決多個(gè)工程之間,數(shù)據(jù)一致性問題捂龄。
Cache:控制手動(dòng)或定時(shí)刷新緩存释涛;提供接口,通過表名獲取數(shù)據(jù)跺讯;提供接口枢贿,通過字段過濾數(shù)據(jù);提供二級(jí)緩存刀脏,數(shù)據(jù)查詢后存入二級(jí)緩存局荚,下次查詢更加快捷。
Redis:用于和Redis數(shù)據(jù)庫交互,獲取或更新版本信息耀态;提供鎖機(jī)制轮傍,保證多個(gè)工程之間更新版本信息時(shí)互不影響。
acc-params-query:提供數(shù)據(jù)查詢接口首装,數(shù)據(jù)結(jié)構(gòu)Map<String, List<Map<String, Object>>>
交互方式
第一步:當(dāng)數(shù)據(jù)庫數(shù)據(jù)更新時(shí)创夜,需通知Redis數(shù)據(jù)庫,更新遠(yuǎn)程版本號(hào)(使用唯一的key值仙逻,一般使用工程名驰吓、系統(tǒng)名、類型等拼接組成)系奉。
第二步:緩存組件定時(shí)(或手動(dòng))向Redis數(shù)據(jù)庫獲取遠(yuǎn)程版本號(hào)檬贰,和本地版本號(hào)進(jìn)行對比,若版本相同缺亮,則說明本地?cái)?shù)據(jù)為最新數(shù)據(jù)翁涤,無需更新;若本地版本與遠(yuǎn)程版本不同萌踱,則需更新本地?cái)?shù)據(jù)葵礼,緩存會(huì)向數(shù)據(jù)請求接口發(fā)送獲取數(shù)據(jù)請求,返回最新數(shù)據(jù)存入本地緩存并鸵,同時(shí)清空二級(jí)緩存鸳粉。
第三步:主工程(父容器)向緩存組件發(fā)起查詢請求后,緩存組件根據(jù)查詢條件(表名园担、字段名等)首先到二級(jí)緩存查詢對應(yīng)數(shù)據(jù)赁严,如果有相應(yīng)的數(shù)據(jù),則直接返回粉铐;若無相應(yīng)數(shù)據(jù),則到本地緩存中獲取相應(yīng)數(shù)據(jù)后返回卤档,并將該數(shù)據(jù)寫入二級(jí)緩存蝙泼。
Maven依賴
<!--依賴緩存組件,加載緩存數(shù)據(jù)-->
<dependency>
<groupId>com.xxx.cache</groupId>
<artifactId>tw-cache</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
配置信息
# 產(chǎn)品名稱
zcRedis.key.productCode=xxx
# 系統(tǒng)名稱
zcRedis.key.systemName=cache
# 系統(tǒng)名(用于區(qū)分使用緩存組件的各個(gè)系統(tǒng))
cache.system.name=xxx
# accParams
# 查詢服務(wù)地址,通過系統(tǒng)名獲取對應(yīng)若干張表數(shù)據(jù)
cache.paramServer.url=http://xxx/xxx/queryCashData
# 定時(shí)任務(wù)
cache.refresh.job.schedule=0 0/5 * * * ?
接口
常用接口有:
1劝枣、獲取當(dāng)前類型的所有參數(shù)
List<T> getParamList(Class<T> paramClass)
2汤踏、根據(jù)條件返回單個(gè)對象
T getParamObject(Class<T> paramClass, Map<String, Object> filters)
3、獲取當(dāng)前類型的所有參數(shù)舔腾,優(yōu)先走本地二級(jí)緩存
List<T> getParamList(Class<T> paramClass, Map<String, Object> filters)
使用示例
List<Map<String,Object>> tableData = ParamsCache.getParamList(GlobalKeyEnum.T_OUTMAP_INF.getTableName(),hashMap);
....