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”数据的过程中发现控制台也打印出了我们想要的结果
但是细心的你还是发现了,redis的客户端中,出现了这样的灵异事件获取“names”的值是null 但是获取乱码****names的值出现了“jack”
这是因为redis采用JdkSerializationRedisSerializer来进行序列化
我们查看源码也可以发现
redis中首先设置valueSerializer = null
再让我们看看其赋值的过程
这里将defaultSerializer赋值给了valueSerializer,那么valueSerializer又是什么呢
我们可以发现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;
}
上一篇: 如何授权查询v$视图
推荐阅读