问题出现的过程如下:
- 首先使用redis-cli执行
set aaa bbb
- 然后使用spring data redis 默认的序列化器(就是不额外配置,会默认使用JdkSerializationRedisSerializer)
- 使用RedisTemplate执行执行get查询aaa,会返回null,但是回到redis-cli发现aaa还在
- 使用RT去创建一个 key=aaa v=qqq的kv,然后到redis-cli去查看,发现并没有覆盖掉原来的aaa,反而增加了一个\xac\xed\x00\x05t\x00\x03aaa,通过还原发现前面这一串不知名的utf-8是¬ít,这个大概是默认序列化器加上去的。其实值也有同样的问题。
- 使用GenericToStringSerializer可以解决这个问题,代码如下
@Bean("redis")
public RedisTemplate<String, String> s() {
RedisTemplate<String, String> redis = new RedisTemplate<>();
redis.setConnectionFactory(redisConnectionFactory());
//这里设置序列化器
redis.setValueSerializer(new GenericToStringSerializer<String>(String.class));
redis.setKeySerializer(new GenericToStringSerializer<String>(String.class));
return redis;
}
- 搜罗的一些常用的序列化器
- StringRedisSerializer
- Jackson2JsonRedisSerializer
- GenericToStringSerializer
- OxmSerializer