SpringCache官方文檔
- 常見(jiàn)問(wèn)題
- 使用redis作為存儲(chǔ)cache鸥拧,@CacheConfig:cacheNames未在key前增加前綴颅停,不同實(shí)體key重復(fù)
未開(kāi)啟RedisCacheManager::setUsePrefix
- 不同cacheName如何配置不同的過(guò)期時(shí)間
springCache配置方法重寫(xiě)掸掏,繼承CachingConfigurerSupport忍弛,重寫(xiě)bean cacheManager皂岔,在setCaches將不同cache配置不同的tts(僅可以保證cacheName已預(yù)定義的cache)
若所使用的cacheManager實(shí)現(xiàn)了方法getMissingCache(該方法在抽象類(lèi)中返回為null铃慷,需各實(shí)現(xiàn)類(lèi)自己實(shí)現(xiàn))单芜,比如RedisCacheManager就實(shí)現(xiàn)了若預(yù)定義cache不存在,則新建cache犁柜,后續(xù)抽象類(lèi)在調(diào)用該方法后洲鸠,將返回的cahce和cacheName放入預(yù)定義的cahceMap中,供下次使用馋缅。該情況需要重寫(xiě)getMissingCache方法扒腕,在新建cache時(shí)候,根據(jù)不同的cacheName配置不同的tts
- 自定義SpringCache存儲(chǔ)
若實(shí)現(xiàn)自定義存儲(chǔ)(官方?jīng)]有提供實(shí)現(xiàn)的)萤悴,主要需要實(shí)現(xiàn)CacheManager和Cache
- CacheManager
繼承AbstractCacheManager(擴(kuò)展官方的可以繼承官方實(shí)現(xiàn)類(lèi))瘾腰,實(shí)現(xiàn)自定義CacheManager
作用:管理所有使用的Cache信息,其實(shí)就是通過(guò)Map<CacheName, Cache>存儲(chǔ)Cache覆履,在SpringCache觸發(fā)時(shí)蹋盆,根據(jù)不同的CacheName找到其存儲(chǔ)實(shí)體
CacheManager獲取不同Cache主要邏輯
public Cache getCache(String name) {
Cache cache = this.cacheMap.get(name);
if (cache != null) {
return cache;
}
else {
// Fully synchronize now for missing cache creation...
synchronized (this.cacheMap) {
cache = this.cacheMap.get(name);
if (cache == null) {
//注意 在map中獲取不到cache時(shí)费薄,或調(diào)用該方法,此方法為實(shí)現(xiàn)類(lèi)自己實(shí)現(xiàn)栖雾,若不返回新Cache則需要拋出錯(cuò)誤
cache = getMissingCache(name);
if (cache != null) {
cache = decorateCache(cache);
this.cacheMap.put(name, cache);
updateCacheNames(name);
}
}
return cache;
}
}
}
- Cache
繼承org.springframework.cache.Cache楞抡,實(shí)現(xiàn)springCache在處理各種情況下所需的原子方法
作用:除了各存儲(chǔ)相關(guān)方法,getName也不能忽略析藕,在某些CacheManger中召廷,setCaches為L(zhǎng)ist,而Map的key值是通過(guò)調(diào)用Cache::getName方法獲取的账胧,若在使用過(guò)程通過(guò)name找不到預(yù)定義的Cache竞慢,就會(huì)觸發(fā)CacheManager的getMissingCache方法
- 實(shí)現(xiàn)原理
通過(guò)AOP實(shí)現(xiàn)注解攔截方法查詢或注入緩存,具體可以翻下注解觸發(fā)的源碼
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者