• 【缓存】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不生效的代码示例如下:
    在这里插入图片描述

    三、解决方案

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

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

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

  • 相关阅读:
    线性表的两个非递减集合求并集
    【c语言 】数组入门
    回溯算法 | 分割字符串 | 复原IP地址 | leecode刷题笔记
    【k8s】kubeadm安装k8s集群
    「51媒体」政企宣传邀请媒体的作用?
    Vue多级路由的实现
    二,几何相交-5,BO算法实现--(3)事件和操作
    C++--哈希思想的应用--位图--布隆过滤器的介绍--1112
    css中px、em、rem、%、vw、vh、vm、rpx 这些单位的区别
    华为全联接大会2022丨华为云打造可信认证体系,加速开发者成长
  • 原文地址:https://blog.csdn.net/weixin_44299027/article/details/134164205