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 的数据库。 官网…

通常指的是将数据存储在远程服务器上

云存储:通常指的是将数据存储在远程服务器上,而不是本地计算机上。对于AWS(Amazon Web Services),云存储服务主要由S3(Simple Storage Service)提供。boto3:这是AWS的官方Python SDK,它允许Python开发者与AWS服务进行交互。S3():在boto3中,S3()是一个客户端对象,用…

C语言经典习题24

文件操作习题 一 编程删除从C盘home文件夹下data.txt文本文件中所读取字符串中指定的字符&#xff0c;该指定字符由键盘输入&#xff0c;并将修改后的字符串以追加方式写入到文本文件C:\home\data.txt中。 #include<stdio.h> main() { char s[100],ch; int i;…

带你学会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切…

使用Docker Compose管理Java微服务

使用Docker Compose管理Java微服务 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨如何使用Docker Compose来管理Java微服务。Docker Compose是一个用于定义和运行多容器Docker应用程序…

【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 完整插入代码…

web UI自动化测试 浏览器模式设置

自动化之浏览器模式设置 做selenium UI自动化测试时&#xff0c;每次都需要启动浏览器、用例运行结束后再关闭浏览器&#xff0c;浏览器启动相当地耗费时间&#xff0c;在本机运行用例的话还得放开双手&#xff0c;可以使用chrome的headless模式&#xff0c;让浏览器在后台运行…

C语言pow函数

cmath库里有pow函数&#xff0c;这个函数在图形处理方面上经常用到&#xff0c;但是如果让你自己写这个函数&#xff0c;就不一定能写出来了&#xff0c;本期文章我就带大家写pow函数 源码&#xff1a; double factorial(int n) {if (n 0) return 1;double result 1;for (i…

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;…

模拟算法概览

前言 LeetCode上的模拟算法题目主要考察通过直接模拟问题的实际操作和过程来解决问题。这类题目通常不需要高级的数据结构或复杂的算法&#xff0c;而是通过仔细的逻辑和清晰的步骤逐步解决。 适合解决的问题 模拟算法适合用来解决那些逻辑明确、步骤清晰且可以逐步执行的问…

JavaFX布局-TitledPane

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

Android 系统启动动画

一、接着我们把 bootanimation.zip 动画文件 预制到 /system/media/ 目录下&#xff1a; 二、目录/system/media/bootanimation.zip PRODUCT_COPY_FILES \$(LOCAL_PATH)/bootanimation.zip:/system/media/bootanimation.zipPRODUCT_ARTIFACT_PATH_REQUIREMENT_WHITELIST \ /…

【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;记录了…

随着软件开发方法的不断演进,Cobol 程序如何适应敏捷开发和持续集成/持续部署(CI/CD)的流程?

Cobol是一种古老的编程语言&#xff0c;最初设计用于商业数据处理。虽然它不是为敏捷开发和CI/CD流程而设计的&#xff0c;但仍然可以通过一些技术和方法来使其与这些现代开发流程兼容。 以下是一些方法可以帮助Cobol程序适应敏捷开发和CI/CD流程&#xff1a; 拆分和模块化&am…

使用文章健康检查指标彻底改变您的知识库

在当今快节奏的数字世界中&#xff0c;向客户提供准确和最新的信息比以往任何时候都更加重要。保持知识库内容准确、相关且高效可能是一项艰巨的任务&#xff0c;尤其是在处理大型信息库时。幸运的是&#xff0c;Baklib 的人工智能支持的文章健康检查指标可以提供一个解决方案来…