最近在學習 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 ,通過跟蹤源碼發現的問題。