You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 2.0迁移后Redis缓存问题及自定义RestTemplate配置

解决Spring Boot 2.0迁移后Redis CacheManager序列化异常问题

我之前升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:21:56