关于SpringBoot存放Redis出现乱码的情况

本文介绍了解决Spring Boot项目中使用Redis出现乱码的方法。主要原因是spring-data-redis默认的序列化方式改变了存储到Redis中的key。文章提供了两种解决方案:一是通过XML配置自定义序列化方式;二是通过注解配置RedisTemplate实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在SpringBoot项目中,将值存入Redis数据库中,会出现乱码的问题

原因:因为spring-data-redis里面对key和value都进行了序列化,将其变成byte[]数组后再调用对应的redis java client进行存储。就会导致存进redis的key发生改变。

解决方法:需要手动定义序列化

1.在xml里面指定:【未测试】

<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"  
    p:connection-factory-ref="jedisConnectionFactory">  
    <property name="keySerializer">  
        <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />  
    </property>  
    <property name="valueSerializer">  
        <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />  
    </property>  
    <property name="hashKeySerializer">  
        <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />  
    </property>  
    <property name="hashValueSerializer">  
        <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />  
    </property>  
</bean>  

2.重写RedisTemplate配置【通过注解的形式调用】

@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {
    /**
     * RedisTemplate配置
     * @param factory
     * @return
     */
    @Bean
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
        StringRedisTemplate template = new StringRedisTemplate(factory);
        //定义key序列化方式
        //RedisSerializer<String> redisSerializer = new StringRedisSerializer();//Long类型会出现异常信息;需要我们上面的自定义key生成策略,一般没必要
        //定义value的序列化方式
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }

}

                                                                    这样就愉快地解决了序列化问题啦

 

### 解决 Spring Boot 项目中 Redis 出现乱码的方法 在 Spring Boot 中,当使用 `RedisTemplate` 对象存储数据到 Redis 数据库时,默认情况下会采用 JDK 序列化方式处理和值。由于 JDK 默认序列化的编码格式为 ISO-8859-1,在 Linux 或 Unix 系统上可能会遇到字符集不匹配的情况从而引发乱码现象[^2]。 为了防止这种情况发生,可以通过自定义配置来更改 `RedisTemplate` 的序列化策略: #### 自定义配置类 创建一个新的 Java 类用于设置 `RedisTemplate` 实例,并指定字符串类型的序列化器以及 JSON 格式的对象序列化器: ```java @Configuration public class RedisConfig { @Autowired private RedisConnectionFactory redisConnectionFactory; @Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); // 设置key的序列化方式为String类型 template.setKeySerializer(new StringRedisSerializer()); // 设置value的序列化方式为JSON格式 Jackson2JsonRedisSerializer<Object> jacksonSer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jacksonSer.setObjectMapper(om); template.setValueSerializer(jacksonSer); template.afterPropertiesSet(); return template; } } ``` 通过上述代码片段可以实现对 `RedisTemplate` 值对序列化机制的有效调整,进而避免因不同平台间字符编码差异所引起的乱码问题[^1]。 此外还可以考虑引入第三方库如 Fastjson 来作为替代方案之一来进行更灵活的数据转换工作[^4];不过需要注意的是官方推荐优先选用内置支持较好的 Jackson 库完成此功能。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值