在一次往Redis缓存中插入一个 Map<Integer, ActivityCacheModel>
,
public void setDisplayActivityMap(Map<Integer, ActivityCacheModel> displayActivityMap) {
redisMapTemplate.opsForValue().set(DISPLAY_ACTIVITY_MAP_KEY, displayActivityMap);
}
然后通过key来进行取值
public Map<Integer, ActivityCacheModel> getDisplayActivityMap() {
Map<Integer, ActivityCacheModel> map = redisMapTemplate.opsForValue().get(DISPLAY_ACTIVITY_MAP_KEY);
if(map == null) {
map = new HashMap<>();
}
return map;
}
在拿到Map后,通过get(activityId)
的方式来获取具体的信息时,发现不能取得数据,而取到的Map中是存在值的,其中activityId
是Integer
类型,然后尝试用String.valueOf(activity)
发现可以取到想要的值,这是我们怀疑是Redis序列化的问题。
原本我们通过Jackson2JsonRedisSerializer
进行序列化操作
@Primary
@Bean
public RedisTemplate<String, ?> redisTemplate(RedisConnectionFactory connectionFactory) {
// 使用fastjson序列化替代jdk序列化
RedisSerializer<Object> redisSerializer = getRedisSerializer();
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
template.setKeySerializer(redisSerializer);
template.setValueSerializer(redisSerializer);
template.setHashKeySerializer(redisSerializer);
template.setHashValueSerializer(redisSerializer);
template.afterPropertiesSet();
return template;
}
private RedisSerializer<Object> getRedisSerializer(){
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer =
new Jackson2JsonRedisSerializer<Object>(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
return jackson2JsonRedisSerializer;
}
之后我们发现Jackson2JsonRedisSerializer
会丢失泛型,导致原本Map<Integer, ActivityCacheModel>
变成了Map<Object, Object>
于是,需要更换Redis序列化的方式,通过FastJson的序列化来修正了这个问题
在pom.xml
中引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>
然后修正RedisConfig中获取RedisSerializer的方式
private RedisSerializer<Object> getRedisSerializer(){
return new GenericFastJsonRedisSerializer();
}
注意:在低版本的fastjson中,是不支持Redis序列化的。