使用@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
    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提供的Cache.get(Object key, Callable<T> 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(在目标方法之后执行)
 // 注意:若在之后执行的话,目标方法一旦抛出异常了,那缓存就清理不掉了~~~~
 boolean beforeInvocation() default false;
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • @CacheEvict + redis实现批量删除缓存

    目录 @CacheEvict + redis批量删除缓存 一.@Cacheable注解 二.@CacheEvict注解 三.批量删除缓存 四.代码 @CacheEvict清除指定下所有缓存 @CacheEvict + redis批量删除缓存 一.@Cacheable注解 添加缓存. /** * @Cacheable * 将方法的运行结果进行缓存:以后再要相同的数据,直接从缓存中获取,不用调用方法: * CacheManager管理多个Cache组件,对缓存的真正CRUD操作在Cache组件中,每

  • spring整合redis缓存并以注解(@Cacheable、@CachePut、@CacheEvict)形式使用

    maven项目中在pom.xml中依赖2个jar包,其他的spring的jar包省略: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.1</version> </dependency> <dependency> <groupId>org.springfra

  • 详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用

    注释介绍 @Cacheable @Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 @Cacheable 作用和配置方法 参数 解释 example value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 例如: @Cacheable(value="mycache") @Cacheable(value={"cache1","cache2"} key 缓存的 key,可以为空,如果指定要按照

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

    目录 @CacheEvict清除指定下所有缓存 @Cacheable 缓存 @CachePut:缓存更新 @CacheEvict:缓存删除 @Cacheable 缓存 @CachePut:缓存更新 @CacheEvict:缓存删除 @CacheEvict清除指定下所有缓存 @CacheEvict(cacheNames = "parts:grid",allEntries = true) 此注解会清除part:grid下所有缓存 @CacheEvict要求指定一个或多个缓存,使之都受影响.

  • 使用脚本实现自动清除指定文件夹下丢失链接文件的符号链接

    使用脚本实现自动清除指定文件夹下丢失链接文件的符号链接 脚本可清除,指定文件夹下,对视链接文件的符号链接. 在使用Linux时,常常会为自己许多文件或者程序建立符号链接,这样就不用每次都到对应的文件夹下去寻找对应的文件而只需要对需要经常访问的文件建立符号链接就可以了,这样就能把你常需要访问的文件放到桌面上,或者指定到另外一个文件夹中. 这样访问时,方便了很多,但是用完之后往往留下许多的符号链接,这些链接需要用户自己手动确认是否可以删除,为linux的使用带来很多的不方便,使用该脚本就能解放你的双

  • 解析Linux下Varnish缓存的配置优化

    Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好. 但与老牌的squid相比,各有各的优劣势,网上大量的相对比较只是在其个人对自己熟悉的应用的最大使用上的发挥而已,可能squid到了有能力的人手上才足以发挥最强大的威力Varnish采用了"Visual Page Cache"技术,在内存的利用上,Varnish比Squid具有优势,它避免了Squid频繁在内存.磁盘中交换文件

  • Nodejs下DNS缓存问题浅析

    无意间看到一个文章,是关于nodejs下发送http请求不会缓存dns结果的.这意味着,如果你基于nodejs写了一个http采集程序,不提供dns缓存则会让每次请求都傻傻的重复解析域名为ip地址.听起来会非常影响性能不是么? 我的项目中,发送http请求并不是使用的node原生的http库,而是依赖一个常用的Request库.我查阅了一下该库的相关文档和github issue,也发现了一些和dns相关的帖子.不过多数说的是,关于dns问题,本身并不是Request库的范畴,而归结于nodej

  • JS实现清除指定cookies的方法

    本文实例讲述了JS实现清除指定cookies的方法,非常实用.分享给大家供大家参考. 具体实现代码如下: function GetCookieValue(name) { var cookieValue = null; if (document.cookie && document.cookie != '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { va

  • python清除指定目录内所有文件中script的方法

    本文实例讲述了python清除指定目录内所有文件中script的方法.分享给大家供大家参考.具体如下: 将脚本存储为stripscripts.py 调用语法 : python stripscripts.py <directory> 使用范例 : python stripscripts.py d:\myfiles # Hello, this is a script written in Python. See http://www.pyhon.org import os,sys,string,r

  • IE8/IE9下Ajax缓存问题

    ajax简介 AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. AJAX = 异步 JavaScript和XML(标准通用标记语言的子集). AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 步入正题: 最近在做一个网站的登录注册框,前端使用了jq

  • IE8下Ajax缓存问题及解决办法

    Ajax简介 AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. AJAX = 异步 JavaScript和XML(标准通用标记语言的子集). AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 下面的代码,在其他浏览器都是正常的,但是在IE8中出现诡

  • C#清除WebBrowser中Cookie缓存的方法

    本文实例讲述了C#清除WebBrowser中Cookie缓存的方法.分享给大家供大家参考,具体如下: 最近用C#写一个程序,用一个窗体中的WebBrowser来登陆网站,但是WebBrowser有cookie缓存,第二次登陆的时候WebBrowser仍然是第一次登陆后的状态,所以要清除WebBrowser的cookie缓存. 在stackoverflow上找到一段可用的代码: [DllImport("wininet.dll", CharSet = System.Runtime.Inte

随机推荐