Spring缓存注解@Cacheable、@CachePut、@CacheEvict使用

简介: Spring缓存注解@Cacheable、@CachePut、@CacheEvict使用

@Cacheable


介绍:@Cacheable可以标记在一个方法上,也可以标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。Spring在缓存方法的返回值时是以键值对进行缓存的,值就是方法的返回结果,至于键的话,Spring又支持两种策略,默认策略和自定义策略,这个稍后会进行说明。需要注意的是当一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的。@Cacheable可以指定三个属性,value、key和condition。


value:value属性是必须指定的,表示当前方法的返回值是会被缓存在哪个Cache上的,对应Cache的名称。其可以是一个Cache也可以是多个Cache,当需要指定多个Cache时其是一个数组。


例:

@Cacheable(value="cache1")//Cache是发生在cache1上的publicUserfind(Integerid) {
returnnull;
}
@Cacheable(value= {"cache1", "cache2"})//Cache是发生在cache1和cache2上的publicUserfind(Integerid) {
returnnull;
}


key:用来指定Spring缓存方法的返回结果时对应的key。可以直接使用“ #参数名 ”或者“ #参数. index ”。


例:

@Cacheable(value="users", key="#id")// #参数名publicUserfind(Integerid) {
returnnull;
}
@Cacheable(value="users", key="#user.id")// #参数.indexpublicUserfind(Useruser) {
returnnull;
}


condition:指定发生的条件。有的时候我们可能并不希望缓存一个方法所有的返回结果。condition属性可以实现这一功能。condition属性默认为空,表示将缓存所有的调用情形。其值是通过SpringEL表达式来指定的,当为true时表示进行缓存处理;当为false时表示不进行缓存处理,即每次调用该方法时该方法都会执行一次。如下示例表示只有当user的id为偶数时才会进行缓存。


例:


@Cacheable(value={"users"}, key="#user.id", condition="#user.id%2==0")
publicUserfind(Useruser) {
System.out.println("find user by user "+user);
returnuser;
 }


@CachePut


介绍:在支持Spring Cache的环境下,对于使用@Cacheable标注的方法,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。@CachePut也可以声明一个方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中


// @CachePut也可以标注在类上和方法上。使用@CachePut时我们可以指定的属性跟@Cacheable是一样的。@CachePut("users")//每次都会执行方法,并将结果存入指定的缓存中publicUserfind(Integerid) {
returnnull;
}

@CacheEvict


介绍:@CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与@Cacheable对应的属性类似。即value表示清除操作是发生在哪些Cache上的(对应Cache的名称);key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;condition表示清除操作发生的条件。下面我们来介绍一下新出现的两个属性allEntries和beforeInvocation。


allEntries:boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素,这比一个一个清除元素更有效率。


例:


@CacheEvict(value="users", allEntries=true)// 删除缓存users下的所有缓存,并不是users下的id等于参数id的缓存publicvoiddelete(Integerid) {
System.out.println("delete user by id: "+id);
 }


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


例:

@CacheEvict(value="users", beforeInvocation=true)
publicvoiddelete(Integerid) {
System.out.println("delete user by id: "+id);
}


@Caching


介绍:@Caching注解可以让我们在一个方法或者类上同时指定多个Spring Cache相关的注解。其拥有三个属性:cacheable、put和evict,分别用于指定@Cacheable、@CachePut和@CacheEvict。


例:

// 同时支持@Cacheable、@CachePut和@CacheEvict的相关功能@Caching(cacheable=@Cacheable("users"), evict= { @CacheEvict("cache2"),
@CacheEvict(value="cache3", allEntries=true) })
publicUserfind(Integerid) {
returnnull;
}


总结:

-

@Cacheable


@CachePut


@CacheEvict


注解范围

类、方法

类、方法

类、方法

缓存功能

可返回所有结果集,也可使用condition缓存直接结果集

可返回所有结果集,也可使用condition缓存直接结果集

清除指定元素,也可使用allEntries清楚所有元素

执行时间

执行前检查缓存

执行前不检查缓存

可使用beforeInvocation指定清除操作在方法执行前后


更多java技术、java面试、互联网技术、娱乐技术请关注下面公众号:


目录
相关文章
|
1月前
|
存储 缓存 Java
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
203 2
|
7月前
|
缓存 NoSQL Java
Spring Cache之本地缓存注解@Cacheable,@CachePut,@CacheEvict使用
SpringCache不支持灵活的缓存时间和集群,适合数据量小的单机服务或对一致性要求不高的场景。`@EnableCaching`启用缓存。`@Cacheable`用于缓存方法返回值,`value`指定缓存名称,`key`定义缓存键,可按SpEL编写,`unless`决定是否不缓存空值。当在类上使用时,类内所有方法都支持缓存。`@CachePut`每次执行方法后都会更新缓存,而`@CacheEvict`用于清除缓存,支持按键清除或全部清除。Spring Cache结合Redis可支持集群环境。
417 6
|
缓存 Java Spring
Cacheable CacheEvict CachePut
Cacheable CacheEvict CachePut
40 0
|
存储 缓存 NoSQL
Spring Boot 中的 @CacheEvict 注解
Spring Boot 中的 @CacheEvict 注解
|
XML 缓存 Java
SpringBoot - @Cacheable、@CacheEvict、@CachePut(一)
SpringBoot - @Cacheable、@CacheEvict、@CachePut(一)
246 0
SpringBoot - @Cacheable、@CacheEvict、@CachePut(一)
|
缓存 Java Spring
SpringBoot - @Cacheable、@CacheEvict、@CachePut(二)
SpringBoot - @Cacheable、@CacheEvict、@CachePut(二)
270 0
SpringBoot - @Cacheable、@CacheEvict、@CachePut(二)
|
缓存 NoSQL Java
Spring系列缓存注解@Cacheable @CacheEvit @CachePut 使用姿势介绍
Spring在3.1版本,就提供了一条基于注解的缓存策略,实际使用起来还是很丝滑的,本文将针对几个常用的注解进行简单的介绍说明,有需要的小伙伴可以尝试一下
254 0
Spring系列缓存注解@Cacheable @CacheEvit @CachePut 使用姿势介绍
|
缓存 Java Spring
Spring FactoryBean 缓存
读完这篇文章你将会收获到 • DisposableBean 的 destroy 执行 • Spring 如何缓存 FactoryBean 产生的单例 bean • 如何解决 FctoryBean 的 getObject 的循环依赖
90 0
|
缓存 搜索推荐 Java
玩转Spring Cache --- @Cacheable/@CachePut/@CacheEvict缓存注解相关基础类打点【享学Spring】(上)
玩转Spring Cache --- @Cacheable/@CachePut/@CacheEvict缓存注解相关基础类打点【享学Spring】(上)
玩转Spring Cache --- @Cacheable/@CachePut/@CacheEvict缓存注解相关基础类打点【享学Spring】(上)
|
消息中间件 设计模式 缓存
玩转Spring Cache --- @Cacheable/@CachePut/@CacheEvict缓存注解相关基础类打点【享学Spring】(中)
玩转Spring Cache --- @Cacheable/@CachePut/@CacheEvict缓存注解相关基础类打点【享学Spring】(中)
玩转Spring Cache --- @Cacheable/@CachePut/@CacheEvict缓存注解相关基础类打点【享学Spring】(中)
下一篇
DataWorks