Spring Cache常用注解

 依赖代码如下:

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

常用注解详解

1. @Cacheable

作用:主要用于配置方法,使其能够根据方法的请求参数对其结果进行缓存。在查询时,会先从缓存中取,若不存在才会再发起对数据库的访问。

主要参数:

value/cacheNames:指定缓存的名称,用于区分不同的缓存集合。

key:缓存对象存储在Map集合中的key值,非必需,缺省按照函数的所有参数组合作为key值。

condition:缓存对象的条件,非必需,需使用SpEL表达式,只有满足表达式条件的内容才会被缓存。

unless:另一个缓存条件参数,非必需,也需使用SpEL表达式,在函数被调用之后才做判断,可以通过对result进行判断。

keyGenerator:用于指定key生成器,非必需。

cacheManager:用于指定使用哪个缓存管理器,非必需。

cacheResolver:用于指定使用哪个缓存解析器,非必需。

2. @CachePut

作用:配置于函数上,能够根据方法的请求参数对其结果进行缓存。与@Cacheable不同的是,@CachePut每次都会真实调用函数,所以主要用于数据新增和修改操作上。

主要参数:与@Cacheable类似,包括value/cacheNames、key、keyGenerator、cacheManager、cacheResolver等。

3. @CacheEvict

作用:配置于函数上,通常用在删除方法上,用来从缓存中移除对应数据。

主要参数:

value/cacheNames:指定要清空的缓存名称。

key:指定要删除的缓存项的key,可以使用SpEL表达式。

allEntries:是否清空指定缓存中的所有缓存项,默认为false。

beforeInvocation:是否在方法执行之前就清空缓存,默认为false,即在方法执行之后清空。

4. @Caching

作用:配置于函数上,组合多个Cache注解使用,以便在一个方法上同时使用@Cacheable、@CachePut、@CacheEvict等注解。

这里用案例讲解一下,

首先创建一个新的项目这里取名为SpringCache-demo

导入依赖pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.3</version><relativePath/></parent><groupId>com.itheima</groupId><artifactId>springcache-demo</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><scope>compile</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version></dependency><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.1</version></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.7.3</version></plugin></plugins></build>
</project>

 启动类加入@EnableCaching注解

@Slf4j
@SpringBootApplication
@EnableCaching
public class CacheDemoApplication {public static void main(String[] args) {SpringApplication.run(CacheDemoApplication.class,args);log.info("项目启动成功...");}
}

 这里提前准备好数据库,spring_cache_demo,创建user表

CREATE TABLE `user` (`id` bigint NOT NULL AUTO_INCREMENT,`name` varchar(45) DEFAULT NULL,`age` int DEFAULT NULL,PRIMARY KEY (`id`)
);

 UserController代码

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {@Autowiredprivate UserMapper userMapper;@PostMapping@CachePut(cacheNames = "userCache",key = "#user.id")  // 如果使用Spring Cache缓存数据,key的生成:userCache::2
//    @CachePut(cacheNames = "userCache",key = "#result.id")  // 对象导航
//    @CachePut(cacheNames = "userCache",key = "#p0.id")
//    @CachePut(cacheNames = "userCache",key = "#a0.id")
//    @CachePut(cacheNames = "userCache",key = "#root.args[0].id")public User save(@RequestBody User user){userMapper.insert(user);return user;}@DeleteMappingpublic void deleteById(Long id){userMapper.deleteById(id);}@DeleteMapping("/delAll")public void deleteAll(){userMapper.deleteAll();}@GetMappingpublic User getById(Long id){User user = userMapper.getById(id);return user;}}

 @CachePut:这是Spring Cache框架提供的注解,用于在方法执行后更新缓存。它在这个例子中被用来在插入或更新用户后,将用户数据放入名为userCache的缓存中。key属性指定了缓存的键,这里使用了#user.id,意味着缓存的键是用户ID。这允许你根据用户ID快速地从缓存中获取用户数据。

注释中的其他@CachePut用法示例展示了不同的键生成方式。例如,#result.id会在方法执行完成后使用返回值(在这个场景中是User对象)的ID作为键;#p0.id、#a0.id和#root.args[0].id都是访问方法参数(在这个例子中是User对象)的ID的不同方式。

这里启动看一下

这里存到redis就成功了,至于userCache::id,就是分目录保存

@Cacheable注解的使用

    @GetMapping@Cacheable(cacheNames = "userCache", key = "#id") //key 的生成 userCache::2public User getById(Long id){User user = userMapper.getById(id);return user;}

断点并没有触发,就直接输出了,这里是因为SpringCache使用了动态代理对象,先访问redis缓存,如果有则直接使用redis里的缓存,如果没有,则需要进行正常查询,并把数据存储到redis缓存中。

@CacheEvict注解使用(单条删除)

    @DeleteMapping@CacheEvict(cacheNames = "userCache",key = "#id") //key 的生成 userCache::2public void deleteById(Long id){userMapper.deleteById(id);}

 

@CacheEvict注解使用(多条删除,全部删除)

	@DeleteMapping("/delAll")@CacheEvict(cacheNames = "userCache",allEntries = true)public void deleteAll(){userMapper.deleteAll();}

 首先新增几条数据,也插入了redis中

执行全部删除之后,redis中没有数据全部被删除

 以上就是Spring Cache常用的注解了

总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/51402.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java编写SIP协议

1、编写Server代码 package com.genersoft.iot.vmp.sip; import javax.sip.*; import javax.sip.message.*; import javax.sip.header.*; import java.util.*;public class SimpleSipServer implements SipListener {private SipFactory sipFactory;private SipStack sipStack…

【前端】一文带你了解 CSS

文章目录 1. CSS 是什么2. CSS 引入方式2.1 内部样式2.2 外部样式2.3 内联样式 3. CSS 常见选择器3.1 基础选择器3.1.1 标签选择器3.1.2 类选择器3.1.3 id 选择器3.1.4 通配符选择器 3.2 复合选择器3.2.1 后代选择器 4. CSS 常用属性4.1 字体相关4.2 文本相关4.3 背景相关4.4 设…

前端必备基础【网络通信】(2024最新版)

Ajax Asynchronous Javascript and XML 的缩写&#xff0c;是使用 JS 发起网络通信的技术统称&#xff0c;具体步骤为&#xff1a; 创建 XMLHttpRequest 实例发出 HTTP 请求接收服务器传回的数据更新网页数据&#xff08;通常是部分内容&#xff0c;而不是整个网页&#xff09…

LLM - 理解 大模型 Batch 推理的 Padding Side (左填充或右填充)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/140697827 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 使用 Left Padding (左填充) 或者 Right Padding (右填充),HuggingFac…

DBeaver安装与使用教程 免费的连接mysql数据库软件

一、DBeaver安装 &#xff08;一&#xff09;Dbeaver下载 DBeaver 是一个通用的数据库管理工具和 SQL 客户端&#xff0c;免费&#xff0c;跨平台&#xff0c;支持 MySQL, PostgreSQL, Oracle, DB2, MSSQL, Sybase, Mimer, HSQLDB, Derby, 以及其他兼容 JDBC 的数据库。 官网…

带你学会Git必会操作

文章目录 带你学会Git必会操作1Git的安装2.Git基本操作2.1本地仓库的创建2.2配置本地仓库 3.认识一些Git的基本概念3.1操作流程&#xff1a; 4.一些使用场景4.1添加文件场景一4.2查看git文件4.3修改文件4.4Git版本回退4.5git撤销修改 5.分支管理5.1查看分支5.2创建本地分支5.3切…

【C++进阶】AVL树详解

文章目录 1. AVL树的概念2. AVL树结点的定义3. AVL 树的插入3.1 关于平衡因子3.2 插入代码 4. AVL 树的旋转逻辑4.1 不需要旋转4.2 左旋4.3 右旋4.4 双旋4.4.1 先右后左单旋&#xff08;RL 旋转&#xff09;4.4.2 先左后右单旋&#xff08;LR 旋转&#xff09; 4.5 完整插入代码…

C语言 | Leetcode C语言题解之第301题删除无效的括号

题目&#xff1a; 题解&#xff1a; struct Next { int l, r, cl, cr; };void vec_push(char*** v, int* n, char* s) {if (!(*n & *n1)) {*v realloc(*v, sizeof(char*) * ((*n << 1) | 1));}(*v)[(*n)] s; }void dfs(const char* s, int i, struct Next next[],…

图片格式怎么转换?这几种图片格式转换方法简单又高效

图片已成为我们日常生活与工作中不可或缺的一部分。然而&#xff0c;不同平台和应用往往对图片格式有着特定的要求&#xff0c;这就使得图片格式的转换成为了一项必备技能。下面给大家分享5种能够简单高效的转换图片格式方法&#xff0c;快来一起学习下吧。 方法一&#xff1a;…

JavaFX布局-TitledPane

JavaFX布局-TitledPane 常用属性textcontentgraphicexpandedcollapsibleanimated 实现方式Javafxml 提供了一个可折叠的标题栏和一个内容区域内容区域可以嵌套其他布局 常用属性 text 设置标题 titledPane.setText("测试标题");content 内容区域&#xff0c;可以单…

【MySQL是怎样运行的 | 第二篇】MySQL三大日志文件

文章目录 2.MySQL三大日志文件2.1日志文件列表2.1.1 redo log2.1.2 bin log2.1.3 undo log 2.2redo log日志详讲2.3 binglog和redo log有什么区别&#xff1f;2.4一条更新语句的执行过程 2.MySQL三大日志文件 2.1日志文件列表 redo log&#xff1a;重做日志&#xff0c;记录了…

JDK 8 升级 17 及 springboot 2.x 升级 3.x 指南

JDK 8 升级 17 简介 从 JDK 8 升级到 JDK 17 的过程中&#xff0c;有几个主要的变化&#xff0c;特别是 Java Platform Module System (JPMS) 的引入&#xff0c;以及一些包路径的调整。以下是与 JDK 17 相关的一些重要变化&#xff1a; Java Platform Module System (JPMS) …

面试题:MySQL 索引

1. 谈一下你对于MySQL索引的理解?(为什么MySQL要选择B+树来存储索引) MySQL的索引选择B+树作为数据结构来进行存储,使用B+树的本质原因在于可以减少IO次数,提高查询的效率,简单来说就是可以保证在树的高度不变的情况下存储更多的数据: IO效率的提高:在MySQL数据库中,…

E19.【C语言】练习:数组

有序序列合并 描述 输入两个升序排列的序列&#xff0c;将两个序列合并为一个有序序列并输出。 数据范围&#xff1a; 1≤n,m≤1000 &#xff0c; 序列中的值满足 0≤val≤30000 输入描述&#xff1a; 输入包含三行&#xff0c; 第一行包含两个正整数n, m&#xff0c;用空…

大模型的经典面试问题及答案

大语言模型&#xff08;LLM&#xff09;在人工智能中变得越来越重要&#xff0c;在各个行业都有应用。随着对大语言模型专业人才需求的增长&#xff0c;本文提供了一套全面的面试问题和答案&#xff0c;涵盖了基本概念、先进技术和实际应用。如果你正在为面试做准备&#xff0c…

ABB机器人EGM功能简单应用

EGM中使用的是Protocol Buffer2的协议&#xff0c;从Egm.proto模板文件中可以了解到&#xff0c;协议版本没有定义默认为proto2&#xff0c;目前最新版本为proto3。PC安装了RobotStudio 6.08后&#xff0c;在如下路径可以找到egm.proto模板文件。 C:\ProgramData\ABB Industri…

ISP-LSC

1. 概述 Lens shading分为两个部分&#xff0c;亮度均匀性&#xff08;luma shading correction&#xff09;&#xff0c;色彩均匀性&#xff08;colour shading correction&#xff09;。 lens 的各位置和中心的透射率不同&#xff1a;luma shading lens 对不同光谱的shift 不…

NOILinux2.0安装

NOI官方已发布NOILinux2.0&#xff0c;可是如何安装使用呢&#xff1f;我来教你。 首先下载VMWare和NOILinux2.0的ios&#xff0c;当然你用什么虚拟机软件都可以。这里我用的是VMware。 NOIlinux2.0的下载链接&#xff1a; NOI Linux 2.0发布&#xff0c;将于9月1日起正式启用…

Cesium 体积云效果

Cesium 体积云效果&#xff08;局部&#xff09; 原理&#xff1a;RayMarching光线步进噪声&#xff0c;需要修改源码让cesium支持3D纹理&#xff08;texImage3D&#xff09; 源码修改思路&#xff1a;Cesium中使用Sampler3D&#xff0c;3D纹理&#xff0c;实现体渲染 感谢思…

Debian12 安装Docker 用 Docker Compose 部署WordPress

服务器准备&#xff1a; 以root账号登录&#xff0c;如果不是root&#xff0c;后面指令需要加sudo apt update apt install apt-transport-https ca-certificates curl gnupg lsb-release添加GPG密钥&#xff0c;推荐国内源 curl -fsSL https://mirrors.aliyun.com/docker…