redis中serializer的坑

star2017 1年前 ⋅ 2992 阅读

问题描述

在项目中对方法使用了@Cacheable注解,然后在其他地方使用这个方法获取值的时候,获取不到。
伪代码如下:

@Cacheable(value = "demo",cacheManager = "fiveManager")
@Override
public Map<Long, Long> getById(Long id){
}

原因分析

找到代码中,redis的配置,发现如下代码:

@Bean
public RedisTemplate<Serializable, Serializable> redisTemplate(RedisConnectionFactory factory) {
  RedisTemplate template = new RedisTemplate();
  template.setConnectionFactory(factory);
  GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
  template.setDefaultSerializer(jackson2JsonRedisSerializer);
  StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
  template.setKeySerializer(stringRedisSerializer);
  template.setHashKeySerializer(stringRedisSerializer);
  template.afterPropertiesSet();
  return template;
}

主要是 template.setHashKeySerializer(stringRedisSerializer); 这行代码,他设置了Map的key为字符串类型,就是你存储在redis中map的key为字符串。在使用的时候,因为key的类型不一致,导致获取不到数据。

问题解决

1、修改需要缓存的方法返回值

@Cacheable(value = "demo",cacheManager = "fiveManager")
@Override
public Map<String, Long> getById(Long id){
}

2、修改redis的Serializer类型

这个可能会有风险,会影响已有代码

反思

主要原因还是对系统不熟悉,因为这块不是本人配置,所有才会出现这个问题。还是需要对系统多了解。

本文为博主原创文章,未经博主允许不得转载。
更多内容请访问:IT源点

全部评论: 0

    我有话说: