springcache清除缓存_什么叫做缓存数据

springcache清除缓存_什么叫做缓存数据概述从spring3开始,spring开始支持缓存组件,并提供了一系列非常方便的注解。其中,Cache接口定义了基本的增删改查方法,Spring提供了一些默认的实现,比如RedisCa

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

概述

从 spring3 开始,spring 开始支持缓存组件,并提供了一系列非常方便的注解。

其中,Cache 接口定义了基本的增删改查方法,Spring 提供了一些默认的实现,比如 RedisCache 等。 CacheManager 接口则用于接入并获取 Redis 这样的缓存组件。

在 springboot 中,当我们启用缓存以后,需要如果要将接入 Redis 作为缓存,就需要配置 RedisCacheManager,其他缓存组件亦同。当没有自定义的缓存的时候,就会使用默认的 ConcurrentMapCacheManager,即将缓存存入本地的一个 Map 集合中。

一、配置

1.添加依赖

在创建项目的时候直接在 springboot 启动器中配置,或在项目中添加 Maven 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

2. 启用注解

在启动类或者配置类里添加 @EnableCaching 注解开启缓存

@EnableCaching//开启缓存
@SpringBootApplication
public class SpringbootCacheApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootCacheApplication.class, args);
    }

}

注意:由于 Spring 的 AOP 基于 CGLib 代理,所以如果在本类调用成员方法,因为不走代理所以缓存是不会生效的。

二、注解与 SpEL 表达式

1.缓存注解

注解 解释
@EnableCaching 开启基于注解的缓存
@CacheConfig 统一配置本类的缓存注解的属性
@Cacheable 第一次调用方法后都将返回值存入缓存,下次则请求直接调用缓存
@CachePut 每次调用方法后都将返回值存入缓存,用于缓存更新
@CacheEvict 清除缓存
@Caching 组合注解,即给一个方法同时设置多个缓存方案

2. SpEL 表达式

spring 表达式支持我们通过指定的明确获取参数或者方法的属性:

名称 位置 描述 示例
methodName root对象 当前被调用的方法名 #root.methodname
method root对象 当前被调用的方法 #root.method.name
target root对象 当前被调用的目标对象实例 #root.target
targetClass root对象 当前被调用的目标对象的类 #root.targetClass
args root对象 当前被调用的方法的参数列表 #root.args[0]
#root.参数名
caches root对象 当前方法调用使用的缓存列表 #root.caches[0].name
Argument Name 执行上下文 当前被调用的方法的参数,如findArtisan(Artisan artisan),可以通过#artsian.id获得参数 #artsian.id
result 执行上下文 法执行后的返回值(仅当方法执行后的判断有效,如 unless cacheEvict的beforeInvocation=false) #result

因为默认对象即为 #root,所以写的时候可以直接省略 #root

此外,表达式同样支持运算符:

类型 运算符
关系 <,>,<=,>=,==,!=,lt,gt,le,ge,eq,ne
算术 +,- ,* ,/,%,^
逻辑 &&,||,!,and,or,not,between,instanceof
条件 ?: (ternary),?: (elvis)

三、使用

1.添加缓存

@Cacheable 注解用于标记方法。第一次执行的时候,会将方法结果存入缓存,再次调用该方法,在执行前,如果 key 相同则直接返回缓存中的数据,不会再次执行方法。

他的主要属性有以下五种:

  • value/cacheName:指定缓存命名空间,只有保证命名空间相同,key 才能找到对应的缓存。
  • key:指定缓存数据的键值对的key,默认为方法参数中的值;
  • Condition:指定缓存执行的条件;
  • unliss:指定缓存不执行的条件;
  • sync:指定缓存是否使用异步模式,默认同步,若异步则不支持 unless。这个主要是用来处理多线程环境下缓存更新导致数据出错的问题的。

上述一些复杂的条件依赖于 sqEl 表达式

/*
 * 方法调用给前进行检测,若存在 key 对应的数据则直接从缓存中返回结果,否则在执行后将返回值存入缓存
 * */
@Override
@Cacheable(cacheNames = "dept",key = "targetClass")
public List<Dept> findAll() {
    System.out.println("全查!");
    return mapper.selectAll();
}

2.缓存更新

@CachePut 注解一般用于更新某个命名空间中的某条缓存数据。当方法调用结束以后,会根据注解将结果存入缓存,如果 key 已经存在,则会更新缓存。

他的主要属性同 @Cacheable 基本相同,但是由于是先执行才处理数据,所以 key 是可以获得 #root.result 的。

/*
* 调用方法后,再把返回值放入缓存
* */
@Override
@CachePut(cacheNames = "dept",key = "#root.targetClass")
public List<Dept> add(Dept dept) {
    System.out.println("增加!");
    mapper.insert(dept);
    return mapper.selectAll();
}

3.清空缓存

@CacheEvict 用于清空某个命名空间内某条、或全部缓存数据。

他的主要属性就两个:

  • allEntries:是否清空全部缓存数据。默认 true,会忽略 key,否则只清除 key 对应的缓存;

  • beforeInvocation:是否要在方法执行前就清空缓存。默认为 false,即执行结束后才清空缓存。

    注意:当发生异常时,是不会清空缓存的。

/*
 * 清除缓存中的数据
 * */
@CacheEvict(cacheNames = "dept", key = "#root.targetClass", beforeInvocation = false)
@Override
public void delete(Integer deptno) {
    System.out.println("删除!");
    mapper.deleteByPrimaryKey(deptno);
}

4.多条件组合

@Caching 是一个组合注解,可以在里面添加复数的以上三种注解。

/*
 * 组合注解,三种注解以每种可有多个,以数组形式存储
 * */
@Caching(
    cacheable = {
        //添加一个缓存
        @Cacheable(value = "dept",key = "#deptno")
    },
    put = {
        //更新一个缓存
        @CachePut(value = "emp",key = "#root.targetClass")
    },
    evict = {
        //清除一个缓存
        @CacheEvict(value = "person",key = "#deptno")
    }
)
@Override
public Dept findById(Integer deptno) {
    return null;
}

5.统一命名空间

@CacheConfig 注解可以在类上统一命名空间,这样类中如果没有指定 cacheName 或者 value,那么默认会使用 @CacheConfig 指定的命名空间。当然,如果在方法上自己指定了另外的命名空间,则以方法上的注解为准。

//使用@CacheConfig统一cacheName,如果在方法上仍写了value,则该方法值仍以value为准
@CacheConfig(cacheNames = "dept")
@Service
public class DeptServiceImp implements DeptService {

    @Resource
    private DeptMapper mapper;
    
    @Override
    @Cacheable(key = "targetClass")
    public List<Dept> findAll() {
        System.out.println("全查!");
        return mapper.selectAll();
    }
    
    @Override
    @CachePut(key = "targetClass")
    public List<Dept> add(Dept dept) {
        System.out.println("增加!");
        mapper.insert(dept);
        return mapper.selectAll();
    }

    @CachePut(key = "targetClass")
    @Override
    public List<Dept> delete(Integer deptno) {
        System.out.println("删除!");
        mapper.deleteByPrimaryKey(deptno);
        return mapper.selectAll();
    }


}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170843.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java WebService接口生成和调用 图文详解

    Java WebService接口生成和调用 图文详解webservice简介:WebService技术,能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件,就可相互交换数据或集成。依据WebService规范实施的应用之间,无论它们所使用的语言、平台或内部协议是什么,都可以相互交换数据。WebService是自描述、自包含的可用网络模块,可以执行具体的业务功能。WebService也很容易部署,因为它们

    2022年7月12日
    17
  • centos7.4安装docker_docker打包python应用

    centos7.4安装docker_docker打包python应用前言当我们在一台电脑上搭建了python3.6的环境,下次换台电脑,又得重新搭建一次,设置环境变量等操作。好不容易安装好,一会提示pip不是内部或外部命令,一会又提示pip:commandno

    2022年7月29日
    10
  • flask中jsonify和json.dumps的区别「建议收藏」

    flask中jsonify和json.dumps的区别「建议收藏」flask提供了jsonify函数供用户处理返回的序列化json数据,而python自带的json库中也有dumps方法可以序列化json对象,那么在flask的视图函数中return它们会有什么不同之处呢?想必开始很多人和我一样搞不清楚,只知道既然框架提供了方法就用,肯定不会错。但作为开发人员,我们需要弄清楚开发过程中各种实现方式的特点和区别,这样在我们面对不同的需求时才能做出相对合理的选择,而…

    2022年5月23日
    30
  • ANSI编码简述_ansi格式编码

    ANSI编码简述_ansi格式编码前情提要美国人最先用电脑,发明了足够他们使用的ASCII编码(127个,1个字节都没用完)。后来欧洲人发现127个不太够,把ASCII没用完的位置用上了(拓展字符集),还叫ASCII。再后来中国想用电脑打汉字,显然256个就太不够了,于是产生了GB2312,GBK,GB18030以及港澳台地区的Big5。此外韩国也有自己韩EUC-KR。ANSI编码为了保证Windows在不同语言文字的国家都能用。微软采用了标准代码页(CodePage,代码页是字符集编码的

    2022年9月23日
    1
  • html中图片连续滚动代码,[转载]网页设计中的图片连续滚动效果——代码「建议收藏」

    html中图片连续滚动代码,[转载]网页设计中的图片连续滚动效果——代码「建议收藏」style=”overflow:hidden;width:500px;”>border=”0″>id=”butong_net_left1″valign=”top”align=”center”>border=”0″>src=”src=”插入需要滚动的图片”>src=”插入需要滚动的图片”>src=”插入需要滚动的图片”>src=”插入需要滚动的图片”&gt…

    2022年7月18日
    16
  • 软件评测师-自动化测试技术

    软件评测师-自动化测试技术一、概述1.自动化测试是把人为驱动的测试行为转化为机器执行的一种过程,模拟手工测试步骤,通过由程序语言编制的测试脚本,自动地完成软件的测试设计、单元测试、功能测试、性能测试等工作,包括测试活动的自动

    2022年7月1日
    23

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号