最近在利用Spring Data操作redis出现了乱码,在key前面出现了\xAC\xED\x00\x05t\x00,value也是如此,只是内容不同,如下图所示:
经过航哥的指导才发现,主要是序列化的原因,最开始的代码使用如下:
@Autowired
RedisTemplate<Object, Object> redisTemplate;
由于该方法(RedisTemplate)使用的是Java默认的序列化工具,也即标准的Java serialization;如下所示:
private boolean enableDefaultSerializer = true;
private RedisSerializer<?> defaultSerializer;
private ClassLoader classLoader;
private RedisSerializer keySerializer = null;
private RedisSerializer valueSerializer = null;
private RedisSerializer hashKeySerializer = null;
private RedisSerializer hashValueSerializer = null;
private RedisSerializer<String> stringSerializer = new StringRedisSerializer();
......
其中:
defaultSerializer = new JdkSerializationRedisSerializer(classLoader != null ? classLoader : this.getClass().getClassLoader());
但是由于标准的序列化添加了类信息,所以在key或者value前面出现了类似下面的结果:
1."\xac\xed\x00\x05t\x00\x05atInt"
2."\xac\xed\x00\x05t\x00\nmySuperKey"
3."\xac\xed\x00\x05t\x00\bsuperKey"
经过研究发现可以通过配置redisTemple的序列化来取出这些乱码,代码如下:
@Bean("redisWithSerial")
public RedisTemplate<Object, Object> getRedisTemplate(RedisTemplate<Object, Object> redisTemplate) {
RedisSerializer<String> stringSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(stringSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(stringSerializer);
return redisTemplate;
}
或者直接使用StringRedisTemplate代替RedisTemplate,因为StringRedisTemplate的序列化配置如下:
public StringRedisTemplate() {
RedisSerializer<String> stringSerializer = new StringRedisSerializer();
setKeySerializer(stringSerializer);
setValueSerializer(stringSerializer);
setHashKeySerializer(stringSerializer);
setHashValueSerializer(stringSerializer);
}
最后测试解决了乱码:
更多请参考Spring Data with Redis和Weird redis key with spring data Jedis。
Back to the top!