本文主要是介绍解决 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
解决后,验证结果如下图:
问题到此得已解决~
这篇关于解决 redis 的 key 出现的 \xac\xed\x00\x05t\x00 乱码问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!