一、问题描述:
数据存储到redis中,从代码中也能从redis中读取到,但是从cli客户端中不能查询到数据,通过scan后发现存入的数据前边都多了一串特殊字符
二、问题分析
存储数据的时候我们使用的是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;
}
}