• 【缓存】Spring全家桶中@CacheEvict无效情况共有以下几种


    Spring全家桶中@CacheEvict无效情况共有以下几种

    一、背景介绍

    SpringBoot中使用@Cacheable注解缓存数据,使用@CacheEvict注解删除缓存。但是在项目使用过程中,发现使用@CacheEvict注解删除缓存无效。

    拓展:@CacheEvict 就是一个触发器,在每次调用被它注解的方法时,就会触发删除它指定的缓存的动作。跟 @Cacheable 和 @CachePut 一样,@CacheEvict 也要求指定一个或多个缓存,也指定自定义的缓存解析器和 key 生成器,也支持指定条件(condition 参数)。

    @CacheEvict 是用来清除缓存的,有以下属性:
    value:缓存位置名称,不能为空。
    key:缓存的key,默认为空。
    condition:触发条件,只有满足条件的情况才会清除缓存,默认为空,支持SpEL。
    allEntries:true表示清除value中的全部缓存,默认为false。

    二、原因分析

    经过网络搜索与总结,Spring全家桶中@CacheEvict无效的原因有以下几种情况:

    • 1、使用@CacheEvict注解的方法必须是Controller层直接调用,Service里间接调用不生效。(我本次出现无效的原因)
    • 2、key值跟你查询方法的key值不统一,所以导致缓存并没有清除。
    • 3、把@CacheEvict的方法和@Cacheable的方法放到一个java文件中写,如果这两个注解在两个java文件的话,会导致@CacheEvict失效。
    • 4、返回值必须设置为void才会生效。网络上有很多同学有返回值的使用@CacheEvict这个注解也是无效的。

    @CacheEvict annotation
    It is important to note that void methods can be used with @CacheEvict

    • 5、@CacheEvict必须作用在走代理的方法上。同原因1。

    在使用Spring @CacheEvict注解的时候,要注意,如果类A的方法function1()被标注了 @CacheEvict注解,那么当类A的其他方法,例如:function2(),去直接调用function1()的时候, @CacheEvict是不起作用的,原因是 @CacheEvict是基于Spring AOP代理类,function2()属于内部方法,直接调用function1()时,是不走代理的。

    @CacheEvict不生效的代码示例如下:
    在这里插入图片描述

    三、解决方案

    知道原因之后,就知道怎么解决了,由于以上有几种原因,针对每种原因的解决方案不同,各自对应解决即可。

    以下为本文中出现问题的解决方案

    在这里插入图片描述
    本文完结!

  • 相关阅读:
    Vue/JS自定义指令:实现元素滑动、移动端适配以及边界处理
    zookeeper无法连接,导致elasticjob控制台无法使用
    c++还原简单的vector
    学习笔记7--车辆控制平台
    Java基本数据类型
    问题一:idea提示java: -source 1.5 中不支持switch中用字符串
    3分钟通过日志定位bug,这个技能测试人必须会!
    如何运用 Kyligence 综合对比餐饮门店的销售能力?
    一个基于Java线程池管理的开源框架Hippo4j实践
    Django多表查询
  • 原文地址:https://blog.csdn.net/weixin_44299027/article/details/134164205