最近在利用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 RedisWeird redis key with spring data Jedis


Back to the top!