添加@Cacheable注解后Spring Redis缓存仍不生效如何解决?
排查方案
优先删除冗余的手动缓存操作代码
@Cacheable基于Spring AOP代理实现,本身就会完成「先查缓存→缓存无则执行方法→方法返回值写入缓存」的全流程。你当前方法里自己编写的cacheManager读写逻辑已经覆盖了注解要处理的流程,先把这部分代码全部删掉,仅保留数据库查询、结果转换返回的核心逻辑,再做测试。检查AOP代理是否生效
@Cacheable注解仅在外部类调用当前方法时才会被拦截生效,如果是当前类内部的其他方法直接调用getUserInfo,走的是类内部本地调用,不会触发代理逻辑,注解自然失效。
解决方案:将getUserInfo方法抽离到单独的Bean中注入调用,或者在当前类中注入自身的代理对象,通过代理对象调用该方法。检查方法与类的权限、注解规则
- 被
@Cacheable标注的方法必须是public权限,私有、包权限、受保护权限的方法都无法被AOP代理,注解不生效 - 标注
@Cacheable的方法所在的类必须是Spring管理的Bean,要确保类上有@Service/@Component等注解,被Spring上下文扫描到
- 被
检查缓存配置与序列化规则
- 可以显式指定缓存Key,避免默认Key生成器逻辑不符合预期:修改注解为
@Cacheable(value = "itemCache", key = "#id") - 确认
UserInfo类有无无参构造方法,Jackson序列化反序列化需要依赖无参构造,序列化失败会导致缓存写入失效 - 临时注释掉
disableCachingNullValues()配置,排除方法返回null导致缓存不写入的问题 - 确认Redis连接配置正常,可先通过
RedisTemplate手动读写Redis,排除连接本身异常的问题
- 可以显式指定缓存Key,避免默认Key生成器逻辑不符合预期:修改注解为
内容的提问来源于stack exchange,提问作者Sili
相关产品推荐
相关产品推荐

