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。