问题描述
在项目中对方法使用了 @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 类型
这个可能会有风险,会影响已有代码
反思
主要原因还是对系统不熟悉,因为这块不是本人配置,所有才会出现这个问题。还是需要对系统多了解。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于