上一篇《開發(fā)平臺之組織架構設計》
背景
平臺里面有一些數(shù)據(jù)會經常被訪問按灶,比如:菜單的鏈接开财、數(shù)據(jù)字典、常用配置等琅坡,而且不會發(fā)生頻繁的改動,這些數(shù)據(jù)都應該考慮加入緩存來優(yōu)化查詢速度残家,避免頻繁地從數(shù)據(jù)庫直接查詢獲取榆俺。那在我們常見的應用中有哪些常見的緩存呢?
常見緩存
EhCache
Ehcache是一種廣泛使用的開源Java分布式緩存坞淮。主要面向通用緩存,Java EE和輕量級容器茴晋。它具有內存和磁盤存儲,緩存加載器,緩存擴展,緩存異常處理程序,一個gzip緩存servlet過濾器,支持REST和SOAP api等特點回窘。
Memcache
Memcache是一個高性能的分布式的內存對象緩存系統(tǒng)诺擅,通過在內存里維護一個統(tǒng)一的巨大的hash表,它能夠用來存儲各種格式的數(shù)據(jù)啡直,包括圖像烁涌、視頻、文件以及數(shù)據(jù)庫檢索的結果等酒觅。簡單的說就是將數(shù)據(jù)調用到內存中撮执,然后從內存中讀取,從而大大提高讀取速度舷丹。
Redis
Redis是一個key-value存儲系統(tǒng)抒钱。和Memcached類似,它支持存儲的value類型相對更多颜凯,包括string(字符串)谋币、list(鏈表)、set(集合)装获、zset(sorted set --有序集合)和hash(哈希類型)瑞信。這些數(shù)據(jù)類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作穴豫,而且這些操作都是原子性的凡简。在此基礎上,redis支持各種不同方式的排序精肃。與memcached一樣秤涩,為了保證效率,數(shù)據(jù)都是緩存在內存中司抱。區(qū)別的是redis會周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件筐眷,并且在此基礎上實現(xiàn)了master-slave(主從)同步。
緩存設計
上述介紹的都是幾種常用的緩存容器习柠,但是在平臺的緩存設計上匀谣,我們更傾向于用接口的方式來使用照棋,便于根據(jù)不同規(guī)模來切換不同的緩存容器。
在設計之前要說一句
無論何時何地武翎,緩存與物理數(shù)據(jù)必須一致性烈炭。
核心設計
通過采用AOP攔截代理方式,設計實現(xiàn)類似spring cache的方式來實現(xiàn)平臺的緩存宝恶,支持注解掃描和配置文件解析符隙、以及手動設置緩存的方式。
類說明
CacheValueProcessor
方法攔截處理類垫毙,主要用來判定方法是否啟用緩存配置霹疫,從而進一步確認緩存的讀取或設置。此處采用責任鏈模式综芥,用于對攔截的方法檢測是否啟用注解或文件配置中的方法丽蝎。
IKeyParser
緩存key表達式解析類,一般數(shù)據(jù)緩存都有一些特別標識毫痕,有些可能來源于傳入的參數(shù)征峦,比如:菜單(menu),組織(unit)消请、數(shù)據(jù)字典(dict栏笆、dict_xxxx),通過動態(tài)運算出某種特征的標識key臊泰。
IResultParser
緩存值解析類蛉加,不同的方法的返回值可能不一樣,比如:map缸逃、list针饥、object或者其他自定義類,通過對緩存返回的結果做動態(tài)轉換為調用者可以接收的返回格式需频。
CacheAPI
緩存容器類丁眼,用來裝載緩存、寫入緩存昭殉、讀取緩存和移除緩存的關鍵緩存操作類苞七,可以接入Encache、Jedis等緩存工具類挪丢。
基于這個設計蹂风,我的輕量級緩存:《Spring Boot 輕量級緩存 Ace-Cache》