redis的key出现的\xac\xed\x00\x05t\x00乱码问题及解决
作者:林志鹏JAVA
这篇文章主要介绍了redis的key出现的\xac\xed\x00\x05t\x00乱码问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
redis的key出现的\xac\xed\x00\x05t\x00乱码
在使用redis进行token的存取的时候,发现了一个严重的问题,那便是根据键获取值的时候一直拿不到,其实已经set进去了。
然后使用redis客户端,遍历所有的键的时候,发现键中有类似 \xac\xed\x00\x05t\x00 的乱码,
如下图
原因分析
spring-data-redis 的 RedisTemplate<K, V>模板类 在操作redis时默认使用JdkSerializationRedisSerializer 来进行序列化。
spring操作redis是在jedis客户端基础上进行的,而jedis客户端与redis交互的时候协议中定义是用byte类型交互,看到spring-data-redis中RedisTemplate<K, V>在操作的时候k,v是泛型对象,而不是byte[]类型的,
这样导致的一个问题就是,如果不对RedisTemplate进行设置,spring会默认采用defaultSerializer = new JdkSerializationRedisSerializer();这个方法来对key、value进行序列化操作,JdkSerializationRedisSerializer它使用的编码是ISO-8859-1
解决办法一
在使用时,规定redisTemplate的类型
@Autowired private RedisTemplate<String,String> redisTemplate
解决办法二
添加 redis 配置类,配置使用的序列化方式
/** * @author linzp * @version 1.0.0 * CreateDate 2020/8/18 22:26 */ @Configuration public class RedisConfig { @Bean(name = "redisTemplate") public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<Object, Object> template = new RedisTemplate<>(); RedisSerializer<String> redisSerializer = new StringRedisSerializer(); template.setConnectionFactory(factory); //key序列化方式 template.setKeySerializer(redisSerializer); //value序列化 template.setValueSerializer(redisSerializer); //value hashmap序列化 template.setHashValueSerializer(redisSerializer); //key haspmap序列化 template.setHashKeySerializer(redisSerializer); return template; } }
解决方法三
使用 StringRedisTemplate 而不是使用 RedisTemplate
解决后,
验证结果如下图:
总结
问题到此得已解决~
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。