SpringCache官方文檔
- 常見問題
- 使用redis作為存儲cache,@CacheConfig:cacheNames未在key前增加前綴,不同實體key重復
未開啟RedisCacheManager::setUsePrefix
- 不同cacheName如何配置不同的過期時間
springCache配置方法重寫,繼承CachingConfigurerSupport,重寫bean cacheManager,在setCaches將不同cache配置不同的tts(僅可以保證cacheName已預定義的cache)
若所使用的cacheManager實現了方法getMissingCache(該方法在抽象類中返回為null,需各實現類自己實現),比如RedisCacheManager就實現了若預定義cache不存在,則新建cache,后續(xù)抽象類在調用該方法后,將返回的cahce和cacheName放入預定義的cahceMap中,供下次使用。該情況需要重寫getMissingCache方法,在新建cache時候,根據不同的cacheName配置不同的tts
- 自定義SpringCache存儲
若實現自定義存儲(官方沒有提供實現的),主要需要實現CacheManager和Cache
- CacheManager
繼承AbstractCacheManager(擴展官方的可以繼承官方實現類),實現自定義CacheManager
作用:管理所有使用的Cache信息,其實就是通過Map<CacheName, Cache>存儲Cache,在SpringCache觸發(fā)時,根據不同的CacheName找到其存儲實體
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時,或調用該方法,此方法為實現類自己實現,若不返回新Cache則需要拋出錯誤
cache = getMissingCache(name);
if (cache != null) {
cache = decorateCache(cache);
this.cacheMap.put(name, cache);
updateCacheNames(name);
}
}
return cache;
}
}
}
- Cache
繼承org.springframework.cache.Cache,實現springCache在處理各種情況下所需的原子方法
作用:除了各存儲相關方法,getName也不能忽略,在某些CacheManger中,setCaches為List,而Map的key值是通過調用Cache::getName方法獲取的,若在使用過程通過name找不到預定義的Cache,就會觸發(fā)CacheManager的getMissingCache方法
- 實現原理
通過AOP實現注解攔截方法查詢或注入緩存,具體可以翻下注解觸發(fā)的源碼
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。