最近在学习 SpringBoot 和 Redis 的集成,使用的时候发现一个问题:通过RedisTemplate存储进去的键值都是16进制的乱码:
127.0.0.1:6379> keys *
1) "\xac\xed\x00\x05t\x00\x04name"
通过查阅资料,找到两种解决方案。
(1) 使用 StringRedisTemplate 替换 RedisTemplate ,是一种较优雅的解决方案:
@Autowired
//private RedisTemplate redisTemplate;
private StringRedisTemplate redisTemplate;// 解决Redis键值乱码问题
效果很明显:
127.0.0.1:6379> keys *
1) "name" # 使用 StringRedisTemplate 后解决
2) "\xac\xed\x00\x05t\x00\x04name" # 第一次存的乱码
(2) 乱码原因是序列化的问题,我们手动定义序列化的方法,有两种实现方案,代码set注入和XML配置,两者本质是一样的:
a.代码 set 注入:
@Autowired
private RedisTemplate redisTemplate;
/**
* 解决Redis乱码问题
* @param redisTemplate
*/
@Autowired(required = false)
public void setRedisTemplate(RedisTemplate redisTemplate) {
RedisSerializer stringSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(stringSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(stringSerializer);
this.redisTemplate = redisTemplate;
}
b.XML配置:
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"
p:connection-factory-ref="jedisConnectionFactory">
<property name="keySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<property name="valueSerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<property name="hashKeySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<property name="hashValueSerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
</bean>
修改后的效果:
127.0.0.1:6379> keys *
1) "name" # 使用 StringRedisTemplate 后解决
2) "name_2" # 指定序列化方法后解决
3) "\xac\xed\x00\x05t\x00\x04name" # 第一次存的乱码
乱码的原因,请参考 Spring Data操作Redis时,发现key值出现 \xac\xed\x00\x05t\x00\tb ,通过跟踪源码发现的问题。