赵泠 2025-04-24 00:35 采纳率: 98.1%
浏览 10
已采纳

Spring Boot Redis序列化设置未生效,数据仍为JSON字符串存储

在Spring Boot项目中,配置了Redis的序列化方式为StringRedisSerializer或JdkSerializationRedisSerializer,但实际存储在Redis中的数据仍然是JSON字符串格式,未按预期序列化。这种问题通常出现在使用@Cacheable等注解时,即使已在RedisTemplate中明确设置key和value的序列化器,数据存储格式仍不符合预期。可能原因包括:1) 配置的RedisTemplate未正确注入到缓存管理器;2) 使用了默认的GenericJackson2JsonRedisSerializer覆盖了自定义序列化设置;3) 缓存配置类未标注@EnableCaching或未正确关联自定义RedisCacheConfiguration。解决此问题需检查RedisTemplate是否被缓存管理器正确使用,并确保序列化配置全局生效。
  • 写回答

1条回答 默认 最新

  • Qianwei Cheng 2025-04-24 00:35
    关注

    1. 问题概述

    在Spring Boot项目中,Redis的序列化方式配置为StringRedisSerializer或JdkSerializationRedisSerializer时,存储在Redis中的数据却仍然是JSON字符串格式。这一问题通常出现在使用@Cacheable等注解时,即使已在RedisTemplate中明确设置key和value的序列化器,数据存储格式仍不符合预期。

    关键词:Spring Boot、Redis、序列化、@Cacheable、RedisTemplate、GenericJackson2JsonRedisSerializer、缓存管理器、自定义序列化器。

    2. 常见原因分析

    1. 配置的RedisTemplate未正确注入到缓存管理器。
    2. 使用了默认的GenericJackson2JsonRedisSerializer覆盖了自定义序列化设置。
    3. 缓存配置类未标注@EnableCaching或未正确关联自定义RedisCacheConfiguration。

    通过逐步排查上述可能的原因,可以定位问题的具体来源。以下将从技术实现角度深入分析每个原因,并提供解决方案。

    3. 解决方案与实施步骤

    以下是解决此问题的详细步骤:

    步骤描述
    1检查RedisTemplate是否被缓存管理器正确使用。确保自定义的RedisTemplate已注入到Spring Cache框架中。
    2确认是否使用了默认的GenericJackson2JsonRedisSerializer。如果是,请明确指定序列化器类型。
    3确保缓存配置类已标注@EnableCaching,并正确关联自定义RedisCacheConfiguration。

    通过上述表格列出的关键步骤,可以帮助开发者快速定位问题所在。

    4. 示例代码与配置

    以下是一个完整的示例代码,展示如何正确配置RedisTemplate和缓存管理器:

    
    @Configuration
    public class RedisConfig {
    
        @Bean
        public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
            RedisTemplate<String, Object> template = new RedisTemplate<>();
            template.setConnectionFactory(connectionFactory);
            template.setKeySerializer(new StringRedisSerializer());
            template.setValueSerializer(new JdkSerializationRedisSerializer());
            return template;
        }
    
        @Bean
        public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
            RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                    .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                    .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new JdkSerializationRedisSerializer()));
            return RedisCacheManager.builder(connectionFactory).cacheDefaults(config).build();
        }
    }
        

    以上代码展示了如何通过自定义RedisTemplate和CacheManager来确保序列化器配置全局生效。

    5. 流程图说明

    以下是解决问题的整体流程图,帮助理解各个步骤之间的关系:

    sequenceDiagram participant Developer as 开发者 participant Application as Spring Boot应用 participant Redis as Redis服务 Developer->>Application: 配置RedisTemplate和CacheManager Application->>Redis: 使用自定义序列化器存储数据 Redis-->>Application: 返回序列化后的数据 Application-->>Developer: 验证存储格式是否符合预期

    通过上述流程图,可以清晰地看到问题解决过程中的关键交互环节。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 4月24日