首先讓我們來看一下原理圖

一:Spring緩存抽象
Spring從3.1開始定義了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口來統(tǒng)一不同的緩存技術(shù);并支持使用JCache(JSR-107)注解簡(jiǎn)化我們開發(fā);
Cache接口為緩存的組件規(guī)范定義,包含緩存的各種操作集合;
Cache接口下Spring提供了各種xxxCache的實(shí)現(xiàn);如RedisCache,EhCacheCache ,ConcurrentMapCache等;
每次調(diào)用需要緩存功能的方法時(shí),Spring會(huì)檢查檢查指定參數(shù)的指定的目標(biāo)方法是否已經(jīng)被調(diào)用過;如果有就直接從緩存中獲取方法調(diào)用后的結(jié)果,如果沒有就調(diào)用方法并緩存結(jié)果后返回給用戶。下次調(diào)用直接從緩存中獲取。
使用Spring緩存抽象時(shí)我們需要關(guān)注以下兩點(diǎn);
1、確定方法需要被緩存以及他們的緩存策略
2、從緩存中讀取之優(yōu)點(diǎn)
優(yōu)點(diǎn)
1、方便快捷高效,可直接嵌入多個(gè)現(xiàn)有的cache實(shí)現(xiàn),簡(jiǎn)寫了很多代碼,可觀性非常強(qiáng)
缺點(diǎn)
1、內(nèi)部調(diào)用,非public方法上使用注解,會(huì)導(dǎo)致緩存無效。由于SpringCache是基于Spring AOP的動(dòng)態(tài)代理實(shí)現(xiàn),由于代理本身的問題,當(dāng)同一個(gè)類中調(diào)用另一個(gè)方法,會(huì)導(dǎo)致另一個(gè)方法的緩存不能使用,這個(gè)在編碼上需要注意,避免在同一個(gè)類中這樣調(diào)用。如果非要這樣做,可以通過再次代理調(diào)用,如((Category)AopContext.currentProxy()).get(category)這樣避免緩存無效
2、不能支持多級(jí)緩存設(shè)置,如默認(rèn)到本地緩存取數(shù)據(jù),本地緩存沒有則去遠(yuǎn)端緩存取數(shù)據(jù),然后遠(yuǎn)程緩存取回來數(shù)據(jù)再存到本地緩存。
設(shè)計(jì)理念
正如Spring框架的其它服務(wù)一樣,Spring cache 首先是提供了一層抽象,核心抽象主要體現(xiàn)在兩個(gè)接口上
org.springframework.cache.Cache
org.springframework.cache.CacheManager
Cache代表緩存本身
CacheManager代表對(duì)緩存的處理和管理等。抽象的意義在于屏蔽實(shí)現(xiàn)細(xì)節(jié)的差異和提供擴(kuò)展性,這一層Cache的抽象解耦了緩存的使用和緩存的后端存儲(chǔ),這樣后續(xù)可以方便的更換后端存儲(chǔ)。
使用Spring Cache分三步:
聲明緩存
開啟Spring的cache功能
配置后端的存儲(chǔ)