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://xiahunao.cn/news/3280806.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

真实体验!猫咪长肉选这些主食罐!猫生、希喂、黑夜传说详细测评

我的猫咖店铺开在高校附近&#xff0c;顾客以学生为主&#xff0c;也有很多养猫人士会到店里来&#xff0c;和我交流选粮经验。不少铲屎官都羡慕我店里的猫咪体格健壮&#xff0c;希望能介绍一些能够帮助猫咪长肉的主食罐头。那么今天我就选择了三款高肉含量的猫罐头进行测评&a…

【JLINK】J-link Commander

官方参考文档&#xff1a;J-Link Commander - SEGGER Wiki 一、运行 打开windows命令行窗口&#xff0c;找到有jlink.exe文件的地方&#xff0c;直接输入jlink.exe即可运行 二、常用命令 输入命令时候&#xff0c;大小写不影响 Command (long)Command (short)ExplanationExa…

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十四)-租云服务器及配环境、docker基本命令

主要介绍了租云服务器和docker配置、基本命令&#xff01;&#xff01;&#xff01; 文章目录 前言 一、云平台 二、租云服务器及安装docker 1.阿里云 2.安装docker 三、docker命令 将当前用户添加到docker用户组 镜像&#xff08;images&#xff09; 容器(container) 四、实战…

在linux运维中为什么第一道防线是云防火墙,而不是waf

在Linux运维和云计算环境中&#xff0c;第一道防线通常是云防火墙&#xff08;Cloud Firewall&#xff09;&#xff0c;而不是Web应用防火墙&#xff08;WAF&#xff09;&#xff0c;主要是因为云防火墙提供了更基础和广泛的网络层安全控制。以下是一些关键原因&#xff1a; 1…

vue elementui 上传视频 以及上传视频失败重新上传没反应的处理方法

<template><el-drawertitle"上传视频"size"50%":visible.sync"drawer":direction"direction"><div class"content"><div class"upload-box" v-if"!secondStep"><!--on-exce…

艾体宝干货 | 如何分析关键网络性能指标?持续接收样品试用申请!

网络性能是企业顺利运营的重要基础&#xff0c;而Allegro流量分析仪作为一款强大的网络性能分析工具&#xff0c;为企业提供了深入了解网络运行状况的途径。在本文中&#xff0c;我们将探讨如何利用Allegro 流量分析仪分析关键网络性能指标&#xff0c;以优化网络性能、提高安全…

AI来了,这4个方面,是我们普通人的赚钱机会

在2024年&#xff0c;AI不仅改变了我们的生活方式,更为我们带来了前所未有的赚钱机会。今天&#xff0c;让我们一起探索如何利用AI赚钱的几种方法。 通过AI做自由职业 还记得小时候大人们常说"一技在身,走遍天下"吗?在AI时代,这句话变得更加真实。自由职业意味着你…

Jeecgboot仪表盘设计器使用https时访问报错

问题 仪表盘设计器设计好后&#xff0c;Nginx配置域名发送https请求时&#xff0c;/drag/page/queryById、/drag/page/addVisitsNumber仍发送http请求。导致发送下面错误&#xff1a; 原因 仪表盘设计器里设计的页面是由后端生成返回给前端的&#xff0c;后端是根据后端服…

金融行业缓存建设历程

本文转载与中原银行分布式缓存平台建设历程及实践经验中原银行分布式缓存平台历经三代建设&#xff0c;实现了高效稳定智能的缓存服务&#xff0c;提升了系统性能与资源利用率&#xff0c;降低了运维难度&#xff0c;强有力的支撑金融业务。https://mp.weixin.qq.com/s/3NgLvAb…

不得不安利的程序员开发神器,太赞了!!

作为一名程序员&#xff0c;你是否常常为繁琐的后端服务而感到头疼&#xff1f;是否希望有一种工具可以帮你简化开发流程&#xff0c;让你专注于创意和功能开发&#xff1f;今天&#xff0c;我要向大家隆重推荐一款绝佳的开发神器——MemFire Cloud。它专为懒人开发者准备&…

Hive3:库操作常用语句

1、创建库 create database if not exists myhive;2、选择库 use myhive;3、查看当前选择的库 SELECT current_database();4、查看库详细信息 desc database myhive;可以查看数据文件在hdfs集群中的存储位置 5、创建库时制定hdfs的存储位置 create database myhive2 …

什么是 HTTP/3?HTTP/3 为何席卷全球?HTTP/3 中有什么新内容?为什么需要它?

超文本传输​​协议 ( HTTP ) 是互联网的基石&#xff0c;有助于加载网页、流式传输视频以及为您最喜爱的应用程序获取数据。 去年 &#xff0c;负责定义互联网技术的组织 互联网工程任务组 ( IETF )对该协议的新版本 HTTP/3 进行了标准化。自那时起&#xff0c;HTTP/3 和相关…

C语言分支结构作业

作业 输入你的身高和体重&#xff0c;测试你的健康状况。 计算bmi的值&#xff0c; bmi &#xff08;体重/身高的平方) 如果bmi 小于18.5&#xff0c;则显示“偏瘦&#xff0c;注意加强营养” 如果bmi 在18.5和23.9之间&#xff0c;则显示“体重指数良好&#xff0c;注意保持…

Linux基本功能

Linux 操作系统&#xff0c;作为开源社区的明星之一&#xff0c;以其稳定性、安全性和灵活性在全球范围内得到广泛应用。 1. 多用户和多任务支持 Linux 是一个真正的多用户系统&#xff0c;允许多个用户同时登录并在同一时间内运行多个程序。每个用户拥有自己的账户和权限&…

Javascript前端面试基础(九)

浏览器缓存 浏览器缓存分为强缓存和协商缓存。当客户端请求某个资源时&#xff0c;获取缓存的流程如下 先根据这个资源的一些http header判断它是否命中强缓存&#xff0c;如果命中则直接从本地获取缓存资源&#xff0c;不会发请求到服务器;当强缓存没有命中时&#xff0c;客户…

数说故事 | 大数据洞察宠物消费市场数据

“班味”越来越重的年轻人正靠养宠物来“拯救”自己的生活。结束了一天的忙碌&#xff0c;推开家门&#xff0c;撸个猫、遛个狗&#xff0c;哪怕云吸一下&#xff0c;命就续上了&#xff0c;感觉瞬间焕发新生&#xff0c;能量值满满。 宠物对于铲屎官的意义&#xff0c;不止于…

MATLAB(2)海底地形模型

一、介绍 在MATLAB中创建海底地形模型&#xff0c;你可以使用不同的方法&#xff0c;包括从现有的数据&#xff08;如地形数据文件、DEM&#xff08;数字高程模型&#xff09;等&#xff09;中加载数据&#xff0c;或者使用数学函数来生成模拟的地形。下面&#xff0c;我将提供…

Flink 实时数仓(二)【DIM 层搭建】

1、DIM 层搭建 1.1、设计要点 DIM层设计要点&#xff1a; DIM层存的是维度表&#xff08;环境信息&#xff0c;比如人、场、货等&#xff09;DIM层的数据存储在 HBase 表中DIM层表名的命名规范为dim_表名 DIM 层表是用于维度关联的&#xff0c;要通过主键&#xff08;维度外…

Magento2 常用命令以及技巧

1.Magento 命令行工具 Magento2 带有一个命令行工具&#xff0c;在windows下&#xff0c;用管理员权限打开MS-DOS命令提示符&#xff0c;然后cd到Magento根目录&#xff0c;运行下面命令&#xff0c;就可 以看到这个强大的命令行工具的命令清单&#xff1a; php bin/magentoU…

【echarts】echarts-liquidfill 水球图

echarts-liquidfill3兼容echarts5 echarts-liquidfill2兼容echarts4 npm install echarts npm install echarts-liquidfill设置水球图背景色和内边框样式 var option {series: [{type: liquidFill,data: [0.6, 0.5, 0.4, 0.3],backgroundStyle: {borderWidth: 5,//边框宽度bo…