Java中的@Cacheable注解的作用详解

 更新时间:2023年10月07日 09:18:08   作者:Myovlmx  
这篇文章主要介绍了Java中的@Cacheable注解的作用详解, 使用 @Cacheable 注解就可以将运行结果缓存,以后查询相同的数据,直接从缓存中取,不需要调用方法,需要的朋友可以参考下

一、@Cacheable的作用

1、缓存使用步骤:

@Cacheable这个注解,用它就是为了使用缓存的。所以我们可以先说一下缓存的使用步骤:

  • 开启基于注解的缓存,使用 @EnableCaching 标识在 SpringBoot 的主启动类上。
  • 标注缓存注解即可

 使用  @Cacheable  注解就可以将运行结果缓存,以后查询相同的数据,直接从缓存中取,不需要调用方法

2、@Cacheable作用:

把方法的返回值添加到Ehcache缓存中。

3、常用属性介绍:

(1)cacheNames/value 用来指定缓存组件的名字,将方法的返回结果放在哪个缓存中,可以是数组的方式,支持指定多个缓存

@Cacheable(cacheNames = "streamUrl", key = "#eventId", unless = "#result == null")
// 数组
@Cacheable(cacheNames = {"streamUrl", "test"}, key = "#eventId", unless = "#result == null")

(2)key:缓存数据时使用的 key。默认使用的是方法参数的值。可以使用 spEL 表达式去编写。

@Cacheable(cacheNames = "streamUrl", key = "#eventId + '[' + #id + ']'", unless = "#result == null")

(3)keyGenerator:key 的生成器,可以自己指定 key 的生成器,通过这个生成器来生成 key。

@Cacheable(value = "ip", keyGenerator = "cacheKeyGenerator")
public IPResponse query(String ip) {
return ipAPI.query(ip);
}

这样放入缓存中的 key 的生成规则就按照你自定义的 keyGenerator 来生成。

不过需要注意的是: @Cacheable 的属性,key 和 keyGenerator 使用的时候,一般二选一。 

(4)condition:符合条件的情况下才缓存。方法返回的数据要不要缓存,可以做一个动态判断

// 表示 id 大于 1 才进行缓存
@Cacheable(cacheNames = "streamUrl", condition = "#id > 1")

(5)unless:否定缓存。当 unless 指定的条件为 true ,方法的返回值就不会被缓存。当然你也可以获取到结果进行判断。(通过  #result  获取方法结果)

(6)sync:是否使用异步模式。默认是方法执行完,以同步的方式将方法返回的结果存在缓存中。

4、spEL 编写 key

前面说过,缓存的 key 支持使用 spEL 表达式去编写,下面总结一下使用 spEL 去编写 key 可以用的一些元数据:

二、@CacheEvict的作用

@CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时,表示其中所有的方法的执行都会触发缓存的清除操作。

@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与@Cacheable对应的属性类似。

即value表示清除操作是发生在哪些Cache上的(对应Cache的名称);

key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;

condition表示清除操作发生的条件。下面我们来介绍一下新出现的两个属性allEntries和beforeInvocation。

2、allEntries属性

allEntries是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,清除缓存中的所有元素,Spring Cache将忽略指定的key。

有的时候我们需要Cache一下清除所有的元素,这比一个一个清除元素更有效率。

3、beforeInvocation属性

清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素

到此这篇关于Java中的@Cacheable注解的作用详解的文章就介绍到这了,更多相关Java中的@Cacheable注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JVM原理之类加载的全过程

    JVM原理之类加载的全过程

    文章详细介绍了Java类加载过程,包括加载、链接、初始化、使用和卸载五个阶段,并解释了符号引用和直接引用的区别,以及类变量和实例变量的区别,此外,还介绍了Class.forName()方法的作用和使用场景
    2025-01-01
  • 一文详解Java过滤器拦截器实例逐步掌握

    一文详解Java过滤器拦截器实例逐步掌握

    这篇文章主要为大家介绍了Java过滤器拦截器实例详解逐步掌握,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Springboot整合Activiti操作详解

    Springboot整合Activiti操作详解

    这篇文章主要给大家详细介绍了Springboot整合Activiti的操作流程,文中流程步骤和代码示例介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2023-07-07
  • Java技巧函数方法实现二维数组遍历

    Java技巧函数方法实现二维数组遍历

    这篇文章主要介绍了Java技巧函数方法实现二维数组遍历,二维数组遍历,每个元素判断下是否为偶数,相关内容需要的小伙伴可以参考一下
    2022-08-08
  • Java实现Base64图片转URL的完整方案

    Java实现Base64图片转URL的完整方案

    这篇文章主要介绍了如何使用Java实现Base64格式图片转换为可访问的URL链接的过程,包括数据有效性校验、图片压缩、方向信息校正以及阿里云OSS存储对接,核心实现代码涵盖了从获取Base64图片数据到上传OSS的完整流程,需要的朋友可以参考下
    2025-11-11
  • 通过java生成读取二维码详解

    通过java生成读取二维码详解

    这篇文章主要介绍了java二维码生成读取详解,二维码再生活在无处不在,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面和小编一起来学习一下吧
    2019-05-05
  • 利用keytools为tomcat 7配置ssl双向认证的方法

    利用keytools为tomcat 7配置ssl双向认证的方法

    双向认证和单向认证原理基本差不多,只是除了客户端需要认证服务端以外,增加了服务端对客户端的认证,下面这篇文章主要介绍了利用keytools为tomcat 7配置ssl双向认证的方法,需要的朋友可以借鉴,下面来一起看看吧。
    2017-02-02
  • Java并发编程中的Exchanger解析

    Java并发编程中的Exchanger解析

    这篇文章主要介绍了Java并发编程中的Exchanger解析,Exchanger用于线程间数据的交换,它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据,这两个线程通过exchange方法交换数据,如果第一个线程先执行exchange()方法,需要的朋友可以参考下
    2023-11-11
  • springboot集成Deepseek4j的项目实践

    springboot集成Deepseek4j的项目实践

    本文主要介绍了springboot集成Deepseek4j的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03
  • mybatis-plus分页查询的实现示例

    mybatis-plus分页查询的实现示例

    这篇文章主要介绍了mybatis-plus分页查询的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08

最新评论