使⽤@CacheEvict清除指定下所有缓存
⽬录
@CacheEvict清除指定下所有缓存
@Cacheable 缓存 @CachePut:缓存更新 @CacheEvict:缓存删除
@Cacheable 缓存
@CachePut:缓存更新
@CacheEvict:缓存删除
@CacheEvict清除指定下所有缓存
@CacheEvict(cacheNames = "parts:grid",allEntries = true)
此注解会清除part:grid下所有缓存
@CacheEvict要求指定⼀个或多个缓存,使之都受影响。此外,还提供了⼀个额外的参数allEntries 。表⽰是否需要清除缓存中的所有元素。默认为false,表⽰不需要。
当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache⼀下清除所有的元素。
@Cacheable 缓存 @CachePut:缓存更新 @CacheEvict:缓存删除
@Cacheable 缓存
说明:在⽀持Spring Cache的环境下,对于使⽤@Cacheable标注的⽅法,Spring在每次执⾏前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执⾏该⽅法,⽽是直接从缓存中获取结果进⾏返回,否则才会执⾏并将返回结果存⼊指定的缓存中。
// @since 3.1 可以标注在⽅法上、类上下同
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Cacheable {
// 缓存名称可以写多个,key的真正组成,以cacheName为前缀,多个就会有多个key产⽣
@AliasFor("cacheNames")
String[] value() default {};
@AliasFor("value")
String[] cacheNames() default {};
// ⽀持写SpEL,切可以使⽤#root,#参数名”或者“#p参数index”
//详情去 blog.csdn/dalong_bamboo/article/details/103844076
String key() default "";
// Mutually exclusive:它和key属性互相排斥。请只使⽤⼀个,直接写bean的名字就可以
String keyGenerator() default "";
/
/⽤于选择使⽤哪个cacheManager
String cacheManager() default "";
//⽤户定义如何处理缓存,实现 org.springframework.cache.interceptor.CacheResolver接⼝
String cacheResolver() default "";
// 表⽰在哪种情况下才缓存结果,可使⽤SpEL,可以使⽤#root。只有true时,才会作⽤在这个⽅法上
String condition() default "";
// 表⽰在哪种情况下不缓存结果,可以写SpEL #root,并且可以使⽤#result拿到⽅法返回值经典值#result == null
String unless() default "";
// true:表⽰强制同步执⾏。(若多个线程试图为**同⼀个键**加载值,以同步的⽅式来进⾏⽬标⽅法的调⽤)
// 同步的好处是:后⼀个线程会读取到前⼀个缓存的缓存数据,不⽤再查库了~~~
// 默认是false,不开启同步one by one的
// @since 4.3 注意是sync⽽不是Async
// 它的解析依赖于Spring4.3提供的(Object key, Callable<T> valueLoader);⽅法
boolean sync() default false;
}
@CachePut:缓存更新
cacheable说明:@CachePut也可以声明⼀个⽅法⽀持缓存功能。
与@Cacheable不同的是使⽤@CachePut标注的⽅法在执⾏前不会去检查缓存中是否存在之前执⾏过的结果,⽽是每次都会执⾏该⽅法,并将执⾏结果以键值对的形式存⼊指定的缓存中。
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Cacheable {
@AliasFor("cacheNames")
String[] value() default {};
@AliasFor("value")
String[] cacheNames() default {};
// 注意:它和上⾯区别是。此处key它还能使⽤#result
String key() default "";
String keyGenerator() default "";
String cacheManager() default "";
String cacheResolver() default "";
String condition() default "";
String unless() default "";
}
@CacheEvict:缓存删除
说明:@CacheEvict是⽤来标注在需要清除缓存元素的⽅法或类上的。当标记在⼀个类上时表⽰其中所有的⽅法的执⾏都会触发缓存的清除操作。
@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与@Cacheable对应的属性类似。
即value表⽰清除操作是发⽣在哪些Cache上的(对应Cache的名称);key表⽰需要清除的是哪个key,如未指定则会使⽤默认策略⽣成的key;condition表⽰清除操作发⽣的条件。
下⾯我们来介绍⼀下新出现的两个属性allEntries和beforeInvocation。
allEntries属性,allEntries是boolean类型,表⽰是否需要清除缓存中的所有元素。
默认为false,表⽰不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。
有的时候我们需要Cache⼀下清除所有的元素,这⽐⼀个⼀个清除元素更有效率。
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Cacheable {
@AliasFor("cacheNames")
String[] value() default {};
@AliasFor("value")
String[] cacheNames() default {};
/
/ 它也能使⽤#result
String key() default "";
String keyGenerator() default "";
String cacheManager() default "";
String cacheResolver() default "";
String condition() default "";
// 是否把上⾯cacheNames指定的所有的缓存都清除掉,默认false
boolean allEntries() default false;
// 是否让清理缓存动作在⽬标⽅法之前执⾏,默认是false(在⽬标⽅法之后执⾏)
// 注意:若在之后执⾏的话,⽬标⽅法⼀旦抛出异常了,那缓存就清理不掉了~~~~
boolean beforeInvocation() default false;
}
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论