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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 最小二乘法(多元)推导

    最小二乘法(多元)推导最小二乘法(多元)推导1声明本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理。2最小二乘法简介最小二乘法是一种优化的方法,它主要是通过最小化误差的平方和来做函数拟合的方法。3最小二乘法多元推导有如下回归模型其中b0,b1,…bp,μ2×1,x2,…xp都是与无关的未知参数。这里设是一个样本。这里令残差平方和的表达式为…

    2022年5月13日
    67
  • webstorm 2022激活码_在线激活

    (webstorm 2022激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月31日
    890
  • css里的clear_css取消某个样式

    css里的clear_css取消某个样式clear:both清除两边,没有用的clear:left清除左边,没有用的clear:right清除右边,没用的

    2025年10月29日
    1
  • python神经网络图像识别note

    python神经网络图像识别noteBP神经网络手写数字识别mnist测试集(28*28)识别mnist训练集60000个样本,测试集10000个样本,发现使用4层BP神经网络784,50,20,10没有3层神经网络784,100,10识别率高.只有88%左右对自己手写的样本更差.先是处理了手写样本的背景色噪声,但是仍然很差,估计1.mnist训练集中对数字图像位置进行了居中,大小进行了统一,自己手写的样本没有做相应…

    2022年5月12日
    36
  • file.getcanonicalpath_maven relativepath

    file.getcanonicalpath_maven relativepathThymeleafcontextPath的获取1.在html标签中路径使用@{}会自动添加上下文路径 eg:请求/thymeleaf接口 &lt;ath:href="@{‘/thymeleaf’}"id="contextPath"&gt;跳转到thymeleaf&lt;/a&gt;2.在js中 eg:请求/thymeleaf接口 //根路径获取相当于jsp的使用${pageContext….

    2025年12月15日
    4
  • 前端性能优化的七种方法是_web前端性能

    前端性能优化的七种方法是_web前端性能前端性能优化主要有七种方法,包括减少请求数量、减少资源大小、优化网络连接、优化资源加载、减少重绘回流、使用性能更好的API和构建优化1、减少请求数量1.1图片处理1.1.1雪碧图雪碧图是根据csssprite音译过来的,就是将很多小图标放在一张图片上就称之为雪碧图,可以减少网站http请求数量,但是当整合图片比较大的时候,一次加载比较慢,随着字体图片、svg图片的流行该技术慢慢退出了舞台1.1.2Base64将图片的内容以Base64格式内嵌到HTML中,可以减少http请求数量,但是

    2025年6月24日
    3

发表回复

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

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