解决 redis 的 key 出现的 \xac\xed\x00\x05t\x00 乱码问题

2022-07-15 07:58:35

今天在使用redis进行token的存取的时候,发现了一个严重的问题,那便是根据键获取值的时候一直拿不到,其实已经set进去了。

然后使用redis客户端,遍历所有的键的时候,发现键中有类似 \xac\xed\x00\x05t\x00 的乱码,如下图

原因分析:

spring-data-redisRedisTemplate<K, V>模板类 在操作redis时默认使用JdkSerializationRedisSerializer 来进行序列化。spring操作redis是在jedis客户端基础上进行的,而jedis客户端与redis交互的时候协议中定义是用byte类型交互,看到spring-data-redis中RedisTemplate<K, V>在操作的时候k,v是泛型对象,而不是byte[]类型的,

这样导致的一个问题就是,如果不对RedisTemplate进行设置,spring会默认采用defaultSerializer = new JdkSerializationRedisSerializer();这个方法来对key、value进行序列化操作,JdkSerializationRedisSerializer它使用的编码是ISO-8859-1

解决办法一:在使用时,规定redisTemplate的类型


@Autowired 
private RedisTemplate<String,String> redisTemplate

解决办法二:添加 redis 配置类,配置使用的序列化方式

/**
 * @author linzp
 * @version 1.0.0
 * CreateDate 2020/8/18 22:26
 */
@Configuration
public class RedisConfig {

    @Bean(name = "redisTemplate")
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();

        template.setConnectionFactory(factory);
        //key序列化方式
        template.setKeySerializer(redisSerializer);
        //value序列化
        template.setValueSerializer(redisSerializer);
        //value hashmap序列化
        template.setHashValueSerializer(redisSerializer);
        //key haspmap序列化
        template.setHashKeySerializer(redisSerializer);
        
        return template;
    }
}

解决方法三:使用 StringRedisTemplate 而不是使用 RedisTemplate

解决后,验证结果如下图:

问题到此得已解决~

  • 作者:林志鹏JAVA
  • 原文链接:https://blog.csdn.net/m4330187/article/details/108091447
    更新时间:2022-07-15 07:58:35