Redis trouble04 -- 数据明明存储进去了,但是读取不到redis中的数据,scan发现数据前面多了xac\xed\x00\x05t\x00\特殊字符

一、问题描述:

数据存储到redis中,从代码中也能从redis中读取到,但是从cli客户端中不能查询到数据,通过scan后发现存入的数据前边都多了一串特殊字符

Redis trouble04 -- 数据明明存储进去了,但是读取不到redis中的数据,scan发现数据前面多了xac\xed\x00\x05t\x00\特殊字符

 二、问题分析

存储数据的时候我们使用的是redis的默认的序列化方式(JDK序列化方式),要想读出来数据,需要使用相同的序列化方式,这就是为什么代码中可以读取到数据,因为代码中的redis使用的还是jdk的序列化方式,但是cli客户端就不一样了,我们使用cli客户端读取数据,使用没有进行序列化的key,和使用jdk序列化之后的key是不一样的,所以查询不到数据

三、解决方案

总结下来我们在使用redis的时候还是要定一个规范,redis的key可以统一的使用string的序列化方式,就不会存在上边的问题,还有就是使用jdk的序列化的方式,很明显,key变长了,这样存储也会增加内存的使用

 @Configuration
public class RedisConfig {
 
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory factory){
        RedisTemplate template = new RedisTemplate <>();
        template.setConnectionFactory(factory);
 
        //替换默认序列化的方式
        //1.设置key的序列化方式为string
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        //1.1设置key的序列化方式为string
        template.setKeySerializer(stringRedisSerializer);
        //1.2设置hash key的序列化方式为string
        template.setHashKeySerializer(stringRedisSerializer);
 
        //2.设置value的序列化方式
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
 
        //2.1设置value的序列化方式为string
        template.setValueSerializer(stringRedisSerializer);
        //2.2设置hash value的序列化方式为json
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
 
        template.afterPropertiesSet();
        return template;
    }
}

 

上一篇:python3连接hbase 操作


下一篇:weblogic漏洞初探之CVE-2015-4852