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

    三、解决方案

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

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

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

  • 相关阅读:
    Jenkins-Slave使用Centos安装的OpenJDK
    【NLP】AI相关比赛汇总(2022)
    创建、检查和反编译世界上(几乎)最短的 C# 程序
    HTML5 MathML介绍
    kafka 第一次小整理(草稿篇)————整理一下自己的认知
    115.Kerberos的安装配置与启用
    你们有没有被骗子洗过脑
    NeuralRecon拜读:单目视频实时连贯三维重建
    Yolo v8代码解析(二)
    Kafka问题纪要
  • 原文地址:https://blog.csdn.net/weixin_44299027/article/details/134164205