使用@CacheEvict清除指定下所有缓存

网友投稿 271 2022-11-12

使用@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”

//详情去 https://blog.csdn.net/dalong_bamboo/article/details/103844076

Shttp://tring 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提供的Cache.get(Object key, Callable valueLoader);方法

boolean sync() default false;

}

@CachePut:缓存更新

说明:@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(在目标方法之后执行)

// 注意:若在之后执行的RTuhfwqLX话,目标方法一旦抛出异常了,那缓存就清理不掉了~~~~

boolean beforeInvocation() default false;

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:关于物联网应用中如何简化基于云的管理的设计方案分析
下一篇:Kafka无法消费!?究竟是bug的“沦陷”还是配置的“扭曲”?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~