springboot使用redisTemplate存放键值对时,发现存放的key和value多了\xac\xed\x00\x05t\x00&的非预期的前缀。
原因:redisTemplate向redis存放使用java对象序列化的值,序列化方式和string的一般方式不同
默认的JdkSerializationRedisSerializerJDKRedis序列化器的序列化方式,使用了JDK自带的ObjectOutPutStream将我们的String对象序列化成了byte[]。把byte数组转回字符串key发现原本的key拼接了乱码的字符串
/**
* 如果key和value都使用的StringRedisSerializer序列化器,则推荐使用StringRedisTemplate
*
* 配置Redis的Key和Value的序列化器
* @param redisTemplate 从容器中获取RedisTemplate
* @return 修改后的RedisTemple
*/
@Bean
public RedisTemplate<Object, Object> redisStringTemplate(RedisTemplate<Object, Object> redisTemplate) {
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringRedisSerializer);
// 如果手动将Value转换成了JSON,就不要再用JSON序列化器了。
// redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
redisTemplate.setValueSerializer(stringRedisSerializer);
return redisTemplate;
}
- Jackson2JsonRedisSerializer:常用来直接序列化Value对象为JSON字符串。内部使用ObjectMapper
- StringRedisSerializer:常用来序列化Key,也可以用来序列化Value。