Redis 注解默认序列化机制
打开 Spring Boot 整合 Redis 组件提供的缓存自动配置类 RedisCacheConfiguration(org.springframework.boot.autoconfigure.cache 包下的),查看该类的源码信息,其核心代码如下
java
@Configuration
class RedisCacheConfiguration {
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory
redisConnectionFactory,ResourceLoader resourceLoader) {
RedisCacheManagerBuilder builder =
RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(this.determineConfiguration(resourceLoader.getClassLoader()));
List<String> cacheNames = this.cacheProperties.getCacheNames();
if(!cacheNames.isEmpty()) {
builder.initialCacheNames(new LinkedHashSet(cacheNames));
}
return (RedisCacheManager)this.customizerInvoker.customize(builder.build());
}
private org.springframework.data.redis.cache.RedisCacheConfiguration
determineConfiguration(ClassLoader classLoader){
if(this.redisCacheConfiguration != null) {
return this.redisCacheConfiguration;
} else {
Redis redisProperties = this.cacheProperties.getRedis();
org.springframework.data.redis.cache.RedisCacheConfiguration config =
org.springframework.data.redis.cache.RedisCacheConfiguration.defaultCacheConfig();
config = config.serializeValuesWith(SerializationPair.fromSerializer(
new JdkSerializationRedisSerializer(classLoader)));
…
return config;
}
}
}
从上述核心源码中可以看出,同 RedisTemplate 核心源码类似,RedisCacheConfiguration 内部同样通过 Redis 连接工厂 RedisConnectionFactory 定义了一个缓存管理器 RedisCacheManager;同时定制 RedisCacheManager 时,也默认使用了 JdkSerializationRedisSerializer 序列化方式。
如果想要使用自定义序列化方式的 RedisCacheManager 进行数据缓存操作,可以参考上述核心代码创建一个名为 cacheManager 的 Bean 组件,并在该组件中设置对应的序列化方式即可
* 注意,在 Spring Boot 2.X 版本中,RedisCacheManager 是单独进行构建的。因此,在 Spring Boot 2.X 版本中,对 RedisTemplate 进行自定义序列化机制构建后,仍然无法对 RedisCacheManager 内部默认序列化机制进行覆盖(这也就解释了基 于注解的 Redis 缓存实现仍然会使用 JDK 默认序列化机制的原因),想要基于注解的 Redis 缓存实现也使用自定义序列化机制,需要自定义 RedisCacheManager.
学习让人快乐,学习更让人觉得无知!学了 1 个多月的《Java 工程师高薪训练营》,才发现自己对每个技术点的认知都很肤浅,根本深不下去,立个 Flag:每天坚持学习一小时,一周回答网上 3 个技术问题,把自己知道都分享出来。