@Cacheable 注解(指定缓存位置)

一、@Cacheable的作用

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

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

2、标注缓存注解即可

使用 @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的作用

1、@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会在调用该方法之前清除缓存中的指定元素

相关推荐
微尘寒风3 小时前
【Git】的安装和使用
java·git
y = xⁿ3 小时前
DeepSeek Harness 学习日记:关于Agent接口,工具调用的底层实现
android·java·学习
侧耳倾听1114 小时前
jwt使用简介
java·jwt
顶点多余4 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
AI人工智能+电脑小能手5 小时前
大白话说Java设计模式-46-责任链模式(业务实战篇)
java·设计模式·责任链模式·风控校验·servlet filter·spring interceptor·链式处理
jay神5 小时前
【计算机毕业设计】基于SpringBoot的程序教学辅助系统
java·前端·vue.js·spring boot·后端·毕业设计·课程设计
2601_962066495 小时前
【Sql Server】Update中的From语句,以及常见更新操作方式
android·java·数据库
yaoxin5211236 小时前
507. Java 反射 - 在 BeanFactory 中实现依赖注入
java·开发语言
OPEN-F7 小时前
C++模板教程:变参模板、折叠表达式与SFINAE
java·开发语言·c++
2601_962072218 小时前
SpringMVC进阶(自定义拦截器以及异常处理)
java