首先我们知道RedisTemplate类可以操作五种数据类型,分别为string,list,hash,set,zset,本次我主要说一下我操作list时所遇到的坑.如果在同一个项目中直接存储对象是没有问题的,无论是序列化还是反序列化都没有问题,但是一旦另外一个项目需要获得这个缓存中的数据就会发现反序列化失败,究其原因就是说不同项目之间没有用相同的序列化方式,那么我们只需要在项目之间采用相同的序列化方式就可以,代码如下,将下述代码放如入启动类下面即可
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 使用Jackson2JsonRedisSerialize 替换默认序列化
@SuppressWarnings("rawtypes")
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);
// 设置value的序列化规则和 key的序列化规则
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
本以为问题解决了,但是在另外一个项目获取对象的时候,会发现反序列化的时候报找不到对象的错误,通过查看Redis存储的对象信息我们会发现对象序列化的时候把对象相应的包名也存进去了,这就比较坑了,代码实例如下
["com.base.common.entity.User",{"id":0,"username":"哈哈哈","displayName":"hhhhh","mobile":null,"department":null,"mail":null,"status":0,"createTime":null,"lastUpdateTime":null,"isManager":0}]
反序列化的时候根据包名找这个对象当然会找不到,所以我们需要保证多个项目之间用的是同一个对象,那么我们就需要将对象放入公司的仓库中,这样问题就解决了,欢迎大家的批评指正