Spring Boot 2.0迁移后Redis缓存问题及自定义RestTemplate配置
我之前升级Spring Boot版本时也碰到过几乎一模一样的Redis缓存序列化问题,核心原因是Spring Boot 2.0对Redis自动配置做了不小的调整——旧版本1.5里CacheManager会复用自定义RestTemplate的序列化配置,但2.0开始RedisCacheManager的创建逻辑完全独立了,不再依赖RestTemplate,导致你的GenericJackson2JsonRedisSerializer配置没被CacheManager用上。
下面是我当时解决这个问题的具体步骤:
1. 复用自定义ObjectMapper构建序列化器
如果你的自定义RestTemplate里用了特定配置的ObjectMapper(比如加了自定义Jackson模块、日期格式化规则等),一定要复用这个ObjectMapper来创建GenericJackson2JsonRedisSerializer,这样缓存的序列化逻辑才能和RestTemplate保持一致:
@Bean public RedisSerializer<Object> genericJackson2JsonRedisSerializer(ObjectMapper customObjectMapper) { // customObjectMapper就是你RestTemplate里用的那个自定义ObjectMapper return new GenericJackson2JsonRedisSerializer(customObjectMapper); }
如果没有单独定义ObjectMapper,也可以直接创建带默认配置的序列化器,但建议和RestTemplate的配置对齐。
2. 配置全局RedisCacheConfiguration
创建一个基础的RedisCacheConfiguration,把上面的序列化器设置为默认的value序列化器:
@Bean public RedisCacheConfiguration redisCacheConfiguration(RedisSerializer<Object> genericJacksonSerializer) { return RedisCacheConfiguration.defaultCacheConfig() // 设置键的序列化器(可选,默认是StringRedisSerializer) .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) // 设置值的序列化器为我们自定义的GenericJackson2JsonRedisSerializer .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJacksonSerializer)); }
3. 构建多个不同TTL的RedisCacheManager
用Spring Boot 2.0推荐的builder模式,为每个TTL创建独立的CacheManager,并应用上面的基础配置:
@Bean(name = "shortTTLCacheManager") public RedisCacheManager shortTTLCacheManager(RedisConnectionFactory connectionFactory, RedisCacheConfiguration baseConfig) { return RedisCacheManager.builder(connectionFactory) // 应用基础配置,然后覆盖TTL为5分钟 .cacheDefaults(baseConfig.entryTtl(Duration.ofMinutes(5))) .build(); } @Bean(name = "mediumTTLCacheManager") public RedisCacheManager mediumTTLCacheManager(RedisConnectionFactory connectionFactory, RedisCacheConfiguration baseConfig) { return RedisCacheManager.builder(connectionFactory) .cacheDefaults(baseConfig.entryTtl(Duration.ofHours(1))) .build(); } @Bean(name = "longTTLCacheManager") public RedisCacheManager longTTLCacheManager(RedisConnectionFactory connectionFactory, RedisCacheConfiguration baseConfig) { return RedisCacheManager.builder(connectionFactory) .cacheDefaults(baseConfig.entryTtl(Duration.ofDays(7))) .build(); }
关键注意点
- Spring Boot 2.0开始不再推荐使用旧的
RedisCacheManager.create()静态方法,改用builder模式可以更灵活地配置缓存属性; - 确保所有CacheManager都复用同一个序列化器配置,避免不同缓存之间出现序列化/反序列化不兼容的问题;
- 如果你的缓存有特殊的key前缀需求,还可以在builder里通过
prefixCacheNameWith()方法统一配置。
这样调整后,你的三个CacheManager就会和自定义RestTemplate使用相同的GenericJackson2JsonRedisSerializer进行序列化,之前的异常应该就能解决了。
内容的提问来源于stack exchange,提问作者YLombardi

