记录一次SpringBoot 2.x Redis 序列化Integer类型不起作用

在一次往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中是存在值的,其中activityIdInteger类型,然后尝试用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序列化的。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值