欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2020-11-04

程序员文章站 2022-04-15 12:09:15
...

springboot中redis写入出现乱码

在用springboot操作redis时:

    public String test() {
        //redisTemplate.opsForValue();//操作字符串
        //redisTemplate.opsForList();//操作List
        //redisTemplate.opsForSet();//操作Set
        //redisTemplate.opsForZSet();//操作ZSet
        //redisTemplate.opsForHash();//操作Map
        redisTemplate.opsForValue().set("names","jack");
        String name = (String) redisTemplate.opsForValue().get("names");
        System.out.println(name);
        return "success";

    }

这里我们向redis插入了这样一个键值对:
key:“names”
value: “jack”
这样操作redis并没有什么问题,我们在取出“names”数据的过程中发现控制台也打印出了我们想要的结果

2020-11-04
但是细心的你还是发现了,redis的客户端中,出现了这样的灵异事件获取“names”的值是null 但是获取乱码****names的值出现了“jack”
2020-11-04
这是因为redis采用JdkSerializationRedisSerializer来进行序列化

我们查看源码也可以发现
2020-11-04
redis中首先设置valueSerializer = null
再让我们看看其赋值的过程
2020-11-04
这里将defaultSerializer赋值给了valueSerializer,那么valueSerializer又是什么呢
2020-11-04
我们可以发现defaultSerializer就是JdkSerializationRedisSerializer,而这就是导致我们乱码的罪魁祸首

解决方案有两种:
1.将序列化方式改成StringRedisSerializer

   @Bean
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {
    RedisSerializer stringSerializer = new StringRedisSerializer();
    redisTemplate.setKeySerializer(stringSerializer);
    redisTemplate.setValueSerializer(stringSerializer);
    redisTemplate.setHashKeySerializer(stringSerializer);
    redisTemplate.setHashValueSerializer(stringSerializer);
    this.redisTemplate = redisTemplate;
}

2.将序列化方式改成jackson2JsonRedisSerializer

   @Bean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringRedisSerializer); //设置key的序列化方式
        redisTemplate.setHashKeySerializer(stringRedisSerializer);//设置hash类型的数据的key的序列化方式


        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);//非final类型的数据才会被序列化
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);//设置value的序列化方式为json
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

        return redisTemplate;
    }