springCache配置中踩的坑
阿新 • • 發佈:2019-01-07
專案基於SpringBoot,使用了SpringCache。
早先在網上找了一份SpringCache的配置,後來由於需要使用到自定義序列化方法,注入一個自定義的序列化類。但是在後來發現自定義的序列化類始終沒有呼叫,後來檢視原始碼後終於發現了原因
先附上正確的配置
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory, SessionSerializer serializer) {
logger.debug("生成快取管理器");
logger. debug("注入的序列化工具={}", serializer);
RedisSerializationContext.SerializationPair pair = RedisSerializationContext.SerializationPair.fromSerializer(serializer);
logger.debug("生成的cache序列化工具={}", pair);
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(); // 生成一個預設配置,通過config物件即可對快取進行自定義配置
config = config.entryTtl(Duration.ofMinutes(10)) // 設定快取的預設過期時間,也是使用Duration設定
.serializeValuesWith(pair)
// .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
. disableCachingNullValues()
; // 不快取空值
logger.debug("初始化完成的config={}", config);
// 設定一個初始化的快取空間set集合
Set<String> cacheNames = new HashSet<>();
cacheNames.add(CACHE_NAME);
return RedisCacheManager.builder(new CusTtlRedisCacheWriter(factory)) // 使用自定義的快取配置初始化一個cacheManager
.cacheDefaults(config)//這一句必須要最先執行,否則實際執行時使用的是defaultConfig
.initialCacheNames(cacheNames)
// .withInitialCacheConfigurations(configMap)
// .transactionAware()
.build();
}
重要在於最後一行return的時候,早先的找到的資料說initialCacheNames方法一定要先執行,否則就會巴拉巴拉~~~,,結果就掉坑了
如果initialCacheNames方法先執行的話,實際上CacheManager裡使用的是DefaultConfig,裡面的序列化方式也就是Jdk序列化,後面在呼叫cacheDefaults也沒有用了。