一、Redis中键值出现乱码情况
1.1 问题描述
1.1.1 使用SpringBoot项目结合redis做缓存,发现Redis客户端工具中db0库key为USER_USER_ID_1000的前缀出现了\xAC\xED\x00\x05t\x00\x11乱码现象,如下图所示。
1.2 问题原因
spring-data-redis 的 RedisTemplate<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
1.3 解决办法
private RedisTemplate<String, Object> redisTemplate;
//指定用redis的序列化方式进行序列化
@Autowired(required = false)
public void setRedisTemplate(RedisTemplate<String,Object> redisTemplate) {
RedisSerializer stringSerializer = new StringRedisSerializer();//序列化为String
//不能反序列化
//Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);//序列化为Json
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(serializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(serializer);
this.redisTemplate = redisTemplate;
}
重启项目,发送请求redis客户端的key和value出现正确结果,如下图所示。