项目基于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也没有用了。