问题描述
在项目中对方法使用了@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源点
注意:本文归作者所有,未经作者允许,不得转载