RedisTemplate Serializer在springboot中使用默认序列化方式引起的问题

1.背景

spring boot中使用redis,默认使用JdkSerializationRedisSerializer来序列化,但是默认的序列化会有个问题:java端存完了,取redis-cli执行:key * ,会发现键值都带有\xAC\xED\x00\x05t\x00\x05这种字符,这如果在集群环境下会导致问题!

2.实践

测试

    @Test
    public void testSerializer(){
        String stringRedisTemplateName = stringRedisTemplate.getKeySerializer().getClass().getName();
        System.out.println("stringRedisTemplateName = " + stringRedisTemplateName);
        String redisTemplateName = redisTemplate.getKeySerializer().getClass().getName();
        System.out.println("redisTemplateName = " + redisTemplateName);
    }

结果

stringRedisTemplateName = org.springframework.data.redis.serializer.StringRedisSerializer
redisTemplateName = org.springframework.data.redis.serializer.JdkSerializationRedisSerializer

可以看出默认stringRedisTemplate是StringRedisSerializer,而redisTemplate是JdkSerializationRedisSerializer;

redis-cli中
在这里插入图片描述

    @Bean
    @ConditionalOnMissingBean(name = "redisTemplate")
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        RedisSerializer stringSerializer = new StringRedisSerializer(); //指定Serializer
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        template.setKeySerializer(stringSerializer);
        template.setValueSerializer(stringSerializer);
        return template;
    }

3.结论

redisTemplate使用默认的JdkSerializationRedisSerializer不利于集群以及与客户端的统一,可指定简单高效的StringRedisSerializer;

最后,如果看完对你有所帮助,不要吝啬关注 / 点赞 / 收藏哟,感谢感谢~

<think>好的,我现在需要帮助用户解决在Spring Boot 3.0中与Redis整合时的序列化配置问题。首先,我得回想一下Spring Boot和Redis整合的基本流程,特别是版本3.0的新变化。可能涉及到依赖项的更新,比如是否使用Spring Data Redis的新版本,或者配置方式有没有变化。 用户提到了序列化问题,这是使用Redis时常见的挑战。因为Redis存储数据时需要将对象序列化成字节流,反序列化时再转回来。如果配置不正确,可能会出现类型转换错误或者数据无法正确存储的问题。Spring Boot默认可能使用JdkSerializationRedisSerializer,但这个不太友好,通常会推荐使用Jackson2JsonRedisSerializer或者GenericJackson2JsonRedisSerializer,这样存储在Redis里的数据是可读的JSON格式。 接下来,我需要考虑如何在Spring Boot 3.0中配置这些序列化器。可能需要创建一个RedisTemplate的Bean,并设置其key和value的序列化方式。同时,还要注意Spring Boot 3.0是否引入了新的配置属性或者废弃了旧的注解,比如是否仍然使用@Configuration来配置,或者有没有自动配置的变动。 另外,用户请求一个示例教程,所以步骤需要详细,包括添加依赖、配置连接信息、创建配置类、定义RedisTemplate,以及可能的使用示例。可能需要检查最新的Spring Data Redis文档,确认是否有新的最佳实践或者API变化,比如对Jakarta EE的支持,因为Spring Boot 3.0已经迁移到Jakarta命名空间了。 还要考虑是否需要处理HashOperations或者其他类型的操作,是否需要为hash key和value单独配置序列化器。另外,可能提到Spring Cache抽象,如何配置缓存管理器的序列化方式,这也是用户可能会用到的部分。 最后,生成相关问题的时候,需要涵盖常见问题,比如如何自定义序列化、处理日期类型、性能优化、禁用默认序列化器以及异常处理等。确保问题对用户进一步探索有帮助,并且覆盖相关主题。</think>在Spring Boot 3.0中整合Redis时,序列化配置是关键环节。以下是具体实现步骤和示例: ### 步骤1:添加依赖 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> ``` ### 步骤2:配置连接信息 ```yaml spring: data: redis: host: localhost port: 6379 password: database: 0 ``` ### 步骤3:创建Redis配置类 ```java @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); // 使用Jackson2Json序列化 Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.activateDefaultTyping(om.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL); serializer.setObjectMapper(om); // 设置序列化规则 template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(serializer); template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(serializer); template.afterPropertiesSet(); return template; } } ``` ### 步骤4:实体类注解 ```java @Data @AllArgsConstructor @NoArgsConstructor public class User implements Serializable { @JsonSerialize(using = ToStringSerializer.class) private Long id; private String name; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; } ``` ### 关键点解析: 1. 使用`Jackson2JsonRedisSerializer`替代默认JDK序列化,提升可读性和跨语言兼容性[^2] 2. `@JsonSerialize`注解处理Long类型精度丢失问题 3. 日期格式通过`@JsonFormat`显式声明 4. `StringRedisSerializer`保证key的可读性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值