SpringBoot中Redis连接池存储对象出现乱码问题的解决教程:Could not read JSON: Unexpected character (�) at position 0.

前言

  SpringBoot是一个非常方便的Java开发框架,但在实际开发过程中,我们难免会遇到一些问题。这里将介绍在使用SpringBoot时,当我们将对象存储到Redis中时,出现了乱码的问题,并将会给出详细的解决方案。

问题背景

  在使用SpringBoot连接Redis的时候,我们通常会选择使用RedisTemplate来进行操作。但是,在使用RedisTemplate将一个类存储到Redis中时,有时候会出现乱码的情况,如下所示:

org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Unexpected character (�) at position 0.

  这个错误提示告诉我们,RedisTemplate无法解析JSON格式的对象,并且在第一个字符位置处出现了意外的字符(即乱码)。

问题分析

  经过仔细查找,我们发现这个问题的原因是RedisTemplate默认使用JdkSerializationRedisSerializer进行序列化,而JdkSerializationRedisSerializer会将对象序列化成字节流,导致我们在取出数据后无法正常解析。

解决方案

方案一:更换序列化器

  为了解决这个问题,我们可以更换RedisTemplate的序列化器。在SpringBoot中,我们可以通过修改application.yml文件来进行配置:

spring:
  redis:
    host: localhost
    port: 6379
    password:
    timeout: 10000
    lettuce:
      pool:
        max-active: 8
        max-idle: 8
        max-wait: -1
        min-idle: 0
      shutdown-timeout: 3000
    # 更换序列化器
    keySerializer: org.springframework.data.redis.serializer.StringRedisSerializer
    valueSerializer: org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer

  这里我们将keySerializer和valueSerializer都更换为了StringRedisSerializer和GenericJackson2JsonRedisSerializer。

方案二:修改存储方式

  除了更换序列化器的方式外,我们也可以选择修改存储的方式。例如,不直接将对象存储到Redis中,而是将其转换成JSON格式再存储。示例代码如下:

@Autowired
private RedisTemplate redisTemplate;

public void setObject(String key, Object value) {
    
    
    // 将对象转换成JSON字符串
    String jsonString = JSON.toJSONString(value);
    redisTemplate.opsForValue().set(key, jsonString);
}
    
public Object getObject(String key) {
    
    
    String value = (String) redisTemplate.opsForValue().get(key);
    // 将JSON字符串转换成对象
    return JSON.parseObject(value, Object.class);
}

  这样,我们就可以正确地将对象存储到Redis中,并且在需要的时候顺利地取出。

结束语

  以上就是本次关于SpringBoot中Redis连接池存储对象出现乱码问题的解决教程,希望能够对您在实际开发中遇到类似问题时有所帮助。

猜你喜欢

转载自blog.csdn.net/java_cpp_/article/details/130798665