当前位置: 首页 > news >正文

Spring Cache简单介绍和使用

目录

一、简介

二、使用默认ConcurrentMapManager 

(一)创建数据库和表

(二)创建boot项目

(三)使用Api

1、@EnableCaching

2、@CachePut

3、@cacheable

4、@CacheEvict

三、使用redis作为cache


一、简介

Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。

Spring Cache提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。
CacheManager是Spring提供的各种缓存技术抽象接口
针对不同的缓存技术需要实现不同的CacheManager:

CacheManager默认使用的ConcurrentMapManager 

Spring Cache 常用注解

 在spring boot项目中,使用缓存技术只需在项目中导入相关缓存技术的依赖包,并在启动类上使用@EnableCaching开启缓存支持即可。
例如,使用Redis作为缓存技术,只需要导入Spring data Redis的maven坐标即可。

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

 spring cache的基本api在web下的context包中

 如果有使用其他的api可以导入cache的依赖

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

二、使用默认ConcurrentMapManager 

(一)创建数据库和表

创建cache_demo数据库,并创建user表

> create database cache_demo;
Query OK, 1 row affected (0.02 sec)> use cache_demo;
Database changed> create table user (
> id bigint primary key,
> name varchar(50),
> age int,
> address varchar(50)
>);

 

 (二)创建boot项目

改POM

<?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.4.5</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.itheima</groupId><artifactId>cache_demo</artifactId><version>1.0-SNAPSHOT</version><properties><java.version>1.8</java.version></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>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.23</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.4.5</version></plugin></plugins></build>
</project>

 写YML

server:port: 8080
spring:application:#应用的名称,可选name: cache_demodatasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/cache_demo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: root
mybatis-plus:configuration:#在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:id-type: ASSIGN_ID

User

@Data
public class User implements Serializable {private static final long serialVersionUID = 1L;private Long id;private String name;private int age;private String address;}UserMapper
====================================================
@Mapper
public interface UserMapper extends BaseMapper<User>{
}UserController
====================================================
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {@Autowiredprivate UserService userService;// 增加User@PostMappingpublic User save(User user){userService.save(user);return user;}// 删除User@DeleteMapping("/{id}")public void delete(@PathVariable Long id){userService.removeById(id);}// 更新User@PutMappingpublic User update(User user){userService.updateById(user);return user;}// 根据id查询User@GetMapping("/{id}")public User getById(@PathVariable Long id){User user = userService.getById(id);return user;}// 根据id和name查询User集合@GetMapping("/list")public List<User> list(User user){LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(user.getId() != null,User::getId,user.getId());queryWrapper.eq(user.getName() != null,User::getName,user.getName());List<User> list = userService.list(queryWrapper);return list;}
}

 主启动类

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

 (三)使用Api

1、@EnableCaching

启动类上加注解@EnableCaching  // 使用spring cache

2、@CachePut

    // 在controller中加入缓存对象@Autowiredprivate CacheManager cacheManager;/*** CachePut:将方法返回值放入缓存* value:缓存的名称,每个缓存名称下面可以有多个key* key:缓存的key*/@CachePut(value = "userCache",key = "#user.id")@PostMappingpublic User save(User user){userService.save(user);return user;}

通过ctrl点进key下载源码后我们可以看到这里使用的是SpEL语言动态获取值

 

测试,使用 postman 发请求 

 

 

 第一次添加会将返回的user存放进cacheManager中

 

3、@cacheable

在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
    /*** Cacheable:在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中* value:缓存的名称,每个缓存名称下面可以有多个key* key:缓存的key* condition:条件,满足条件时才缓存数据* unless:满足条件则不缓存*/@Cacheable(value = "userCache",key = "#id",unless = "#result == null")@GetMapping("/{id}")public User getById(@PathVariable Long id){User user = userService.getById(id);return user;}

测试,我们使用jack的id去查询一下,同样使用postman,在这个方法设置断点,如果没有触发断点说明是在cache中查询直接返回的

 4、@CacheEvict

    /*** CacheEvict:清理指定缓存* value:缓存的名称,每个缓存名称下面可以有多个key* key:缓存的key*/@CacheEvict(value = "userCache",key = "#p0")//@CacheEvict(value = "userCache",key = "#root.args[0]")//@CacheEvict(value = "userCache",key = "#id")@DeleteMapping("/{id}")public void delete(@PathVariable Long id){userService.removeById(id);}//@CacheEvict(value = "userCache",key = "#p0.id")//@CacheEvict(value = "userCache",key = "#user.id")//@CacheEvict(value = "userCache",key = "#root.args[0].id")@CacheEvict(value = "userCache",key = "#result.id")@PutMappingpublic User update(User user){userService.updateById(user);return user;}

三、使用redis作为cache

导入redis依赖

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

修改YML

server:port: 8080
spring:application:#应用的名称,可选name: cache_demodatasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/cache_demo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: 123456redis:host: 192.168.23.100port: 6379password: zjy123...000database: 1cache:redis:time-to-live: 1800000 #设置缓存过期时间,可选
mybatis-plus:configuration:#在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:id-type: ASSIGN_ID

启动项目后,cache变成了RedisCacheManager

 

使用postman发送save请求

db01

 发送DELETE删除缓存

 

 

 

相关文章:

Spring Cache简单介绍和使用

目录 一、简介 二、使用默认ConcurrentMapManager &#xff08;一&#xff09;创建数据库和表 &#xff08;二&#xff09;创建boot项目 &#xff08;三&#xff09;使用Api 1、EnableCaching 2、CachePut 3、cacheable 4、CacheEvict 三、使用redis作为cache 一、简…...

ECCV 2022|面向精确的主动相机定位算法

标题&#xff1a;ECCV 2022,山东大学、北大、腾讯AILab、斯坦福和三维家联合提出&#xff0c;面向精确的主动相机定位算法项目地址&#xff1a;https://github.com/qhFang/AccurateACL.文章&#xff1a;Towards Accurate Active Camera Localization&#xff08;ECCV 2022&…...

web实现环形旋转、圆形、弧形、querySelectorAll、querySelector、clientWidth、sin、cos、PI

文章目录1、HTML部分2、css部分3、JavaScript部分4、微信小程序演示1、HTML部分 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge">&l…...

PyCharm+Python+Selenium自动化测试动态验证码识别

driver.find_element(byBy.ID,valueUSERID).send_keys("admin")driver.find_element(byBy.ID,valuePASSWORD_VIEW).send_keys("123456")#ocr识别原理&#xff1a;先根据验证码的class dl_yzm定位到验证码图片&#xff0c;然后将验证码截图保存&#xff0c;…...

git版本回退简单记录

简单记录git版本回退的命令&#xff0c;参考的是这篇文章1 首先查看以前存档的版本&#xff1a; git log1. 知道要回退的版本和现在的版本差了多少代 回退上一代版本&#xff08;1个以前&#xff09; git reset –hard HEAD^回退上上一代版本&#xff08;2个以前&#xff0…...

QT入门Display Widgets之QLine、QLcdNumber、QTextBrowser

目录 一、QLine界面相关 1、布局介绍 2、界面基本属性 二、QLCDNumber的介绍 1、界面布局 2、定时器代码测试 三、QTextBrowser 此文为作者原创&#xff0c;创作不易&#xff0c;转载请标明出处&#xff01; 一、QLine界面相关 1、布局介绍 先看下界面中创建个Q…...

Spring学习笔记

目录1 IOC容器1.1 概念1.2 IOC的底层原理1.3 Spring中IOC容器的两种实现方式(两个接口)1.3.1 BeanFactory接口1.3.2 ApplicationContext接口1.3.3 为什么开发中使用ApplicationContext接口1.3.4 ApplicationContext接口的两个实现类1.4 IOC操作之bean管理1.4.0 bean是什么&…...

数据的标准化处理

假设各个指标之间的水平相差很大&#xff0c;此时直接使用原始指标进行分析时&#xff0c;数值较大的指标&#xff0c;在评价模型中的绝对作用就会显得较为突出和重要&#xff0c;而数值较小的指标&#xff0c;其作用则可能就会显得微不足道。 因此&#xff0c;为了统一比较的标…...

性能优化|记一次线上OOM问题处理

概述最近线上监控发现 OOM 涨幅较大&#xff0c;因此去尝试定位和修复这个问题&#xff0c;在修复了一些内存泄漏和大对象占用问题后, OOM 依旧未达到正常标准&#xff0c;在这些新上报的 hprof 文件中&#xff0c;发现几乎所有 case 中都有个叫 FinalizerReference 的对象&…...

Vue动态粒子特效插件(背景线条吸附动画)

目录 效果图&#xff1a; 一、安装&#xff1a; 二、引入 main.js 文件&#xff1a; 三、使用&#xff1a; 四、属性说明&#xff1a; 效果图&#xff1a; 一、安装&#xff1a; npm install vue-particles --save 二、引入 main.js 文件&#xff1a; import VueParticles…...

【Java 类】002-类、属性、方法、代码块

【Java 类】002-类、属性、方法、代码块 文章目录【Java 类】002-类、属性、方法、代码块一、类1、类与对象2、类的作用3、创建与使用类类结构创建类调用类运行结果4、Java 类的执行过程5、封装、继承、多态、抽象类、内部类、接口、枚举、记录、注解等二、属性1、概述2、类型3…...

Ubuntu Linux 编译安装的基本步骤

文章目录1 基本步骤若报错&#xff1a; No such file or directory2 解压 tar.bz2文件参考&#xff1a;1 基本步骤 解压&#xff1a; tar -zxvf file.tar.gz 进入解压后的文件夹&#xff1a; cd file 源码编译安装 ./configure # ./configmakesudo make install 若报错&…...

day59反刍笔记

1.本地环境安装vue后&#xff0c;没有vue.js文件&#xff0c;只有vue.cjs.js文件&#xff0c; 引用后也无法正常使用&#xff0c;看npm install vue后的文件夹中没有vue.js文件_找不到vue.js_一枝风的博客-CSDN博客 老哥的博客后得到启发&#xff0c;将原本的命令由&#xff1…...

【阅读笔记】你不知道的Javascript--强制类型转换4

目录强制类型转换基本概念JSONboolean强转归纳其他知识点被诟病的安全使用隐式强转法则抽象关系比较语法表达式变动强制类型转换 基本概念 类型转换发生在静态类型语言的编译阶段&#xff1b; 强制类型转换则发生在动态类型语言的运行时&#xff08;runtime&#xff09; JSON…...

华为OD机试真题Python实现【有效子字符串】真题+解题思路+代码(20222023)

有效子字符串 题目 输入两个字符串S和L,都只包含小写字母, S长度 <= 100,L长度 <= 500000, 判断S是否是L的有效子字符串, 判定规则:S中的每个字符在L中都能找到(可以不连续) 且S在L中字符的前后顺序与S中顺序要保持一致 例如: S="ace"是L="abcd…...

上门按摩预约APP源码-东郊到家源码(开发,PHP,平台搭建)

一、什么是上门按摩预约APP源码&#xff1f; 上门按摩预约APP源码是一款家政服务类型的APP&#xff0c;可以帮忙用户在家就能享受按摩的服务。APP源码分两端&#xff0c;一端是用户端&#xff0c;另外一端是技师端。采用的技术&#xff0c;前端是安卓IOS&#xff0c;后端是PHP&…...

STL讲解——模拟实现vector

STL讲解——模拟实现vector vector深度剖析 在STL源码中&#xff0c;发现vector定义的并不是 start、size、capacity&#xff0c;而是start、finish、end_of_storage. 这样就可以得到size()和capacity()。 sizefinish-start capacityend_of_storage-start 扩容可能是本地扩容也…...

各种经典排序算法介绍及实现源码

一,冒泡排序(Bubble Sort) 排序算法是程序员必须了解和熟悉的一类算法,排序算法有很多种,基础的如:冒泡、插入、选择、快速、归并、计数、基数和桶排序等。 冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求,如果不…...

历史大讲堂:这是真·图形化 苹果系统历史回顾(上)

众所周知&#xff0c;米国有个非常牛掰的公司叫苹果&#xff0c;想必大家对这个logo不陌生吧。 目前已发布的苹果产品有iPhone、iPad、iPod等等&#xff0c;简直花样繁多&#xff0c;而且各种功能很好用&#xff0c;我的手机就是一部苹果iPhone X。 等一下&#xff0c;似乎扯远…...

今天女神节,用python画个贺卡送给母亲吧

今天女神节&#xff0c;你给女神妈妈准备了什么祝福呢&#xff1f;如果还没有&#xff0c;那么画个贺卡送给她吧&#xff0c;在你眼里&#xff0c;她是一个什么样的人呢&#xff1f; 是"可爱"&#xff0c;“温柔”&#xff0c;“美丽”&#xff0c;“漂亮”&#xf…...

【编程基础之Python】11、Python中的表达式

【编程基础之Python】11、Python中的表达式Python中的表达式表达式与运算符算术表达式赋值表达式比较表达式逻辑表达式位运算表达式总结Python中的表达式 在Python中&#xff0c;表达式是由操作数、运算符和函数调用等组成的语法结构&#xff0c;可以进行各种数学运算、逻辑判…...

华为OD机试真题Python实现【乱序整数序列两数之和绝对值最小】真题+解题思路+代码(20222023)

乱序整数序列两数之和绝对值最小 题目 给定一个随机的整数数组(可能存在正整数和负整数)nums, 请你在该数组中找出两个数,其和的绝对值(|nums[x]+nums[y]|)为最小值 并返回这两个数(按从小到大返回)以及绝对值。 每种输入只会对应一个答案。但是,数组中同一个元素不能使用两…...

字符串转换整数 (atoi)(python)

链接&#xff1a; https://leetcode.cn/problems/string-to-integer-atoi 题目描述&#xff1a; 请你来实现一个 myAtoi(string s) 函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数&#xff08;类似 C/C 中的 atoi 函数&#xff09;。 函数 myAtoi(string s) 的算法…...

洛谷 P1115 最大子段和

题目链接&#xff1a;P1115 最大子段和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 给出一个长度为 n 的序列 a&#xff0c;选出其中连续且非空的一段使得这段和最大。 输入格式 第一行是一个整数&#xff0c;表示序列的长度 n。 第二行有 n 个整数&#xff…...

【Linux】-- 权限和Shell运行原理

目录 Shell的运行原理 用户切换 su - / su sudo 权限 chmod chown chgrp 八进制方法修改文件属性 目录权限 粘滞位 umask 自定义默认权限 Shell的运行原理 广义上&#xff0c;Linux发行版 Linux内核 外壳程序 Linux 从广义上来理解它是一个操作系统 而从狭义上…...

C++各类设计模式及实现详解

软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性&#xff1a;封装、继承、多态&#xff0c;真正领悟设计模式的精髓是可能一个漫长的过程&#xff0c;需要大量实践经验的积累。最近看设计模式的书&#xff0…...

【Linux】进程理解与学习(Ⅰ)

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅&#x1f339;相关文章推荐&#xff1a;【Linux】冯.诺依曼体系结构与操作系统进程概念什么是进程&#xff1f;进程是什么&#xff1f;我们打开任务管理器可以看到有…...

认识代码之前,请先认识你自己 |《编程人生》

这是我的湛庐课程《给技术人的职场突围课》 &#xff08;链接&#xff09; 的一部分。 这篇文章也是 IT 女神征文活动 的一部分。 《编程人生》是一本优秀程序员的采访集&#xff0c;里面记录了15位世界级编程大师的故事。 我在 发刊词 里面说过&#xff0c;在这个书单课里&am…...

react学习笔记-5:react路由

react旧版本路由 旧版本的路由是按照组件的方式来写的 编写router/index.tsx文件 import App from "../App" import Home from "../views/Home" import About from "../views/About" import { BrowserRouter,Routes,Route } from "react…...

[Python图像处理] 使用高通滤波器实现同态滤波

使用高通滤波器实现同态滤波同态滤波基础实现同态滤波相关链接同态滤波基础 同态滤波是一种去除图像中乘性噪声的技术&#xff0c;常用于校正图像中的不均匀照明。根据图像形成的光照反射模型&#xff0c;图像 f(x,y)f(x,y)f(x,y) 可以由以下两个分量表征&#xff1a; 入射到…...

刷网站关/关键词挖掘工具免费

小程序的官方文档中有这样一段话自基础库版本 1.5.0 起&#xff0c;触摸类事件支持捕获阶段。捕获阶段位于冒泡阶段之前&#xff0c;且在捕获阶段中&#xff0c;事件到达节点的顺序与冒泡阶段恰好相反。需要在捕获阶段监听事件时&#xff0c;可以采用capture-bind、capture-cat…...

天津港电子商务网/佛山做seo推广公司

要在Unicode字符集环境下把CString转化为char* 方法: CString str _T("D://校内项目//QQ.bmp");//leo这个NB 可以降在Unicode下的CString转化为char* //声明标识符 USES_CONVERSION; //调用函数&#xff0c;T2A和W2A均支持ATL和MFC中的字符转换 char *…...

如何创建自己网站/交换链接名词解释

当把java项目打包成jar后&#xff0c;如何运行main函数呢&#xff1f; 第一种:指定运行类: 1 java -cp test.jar com.ming.test.Test 第二种&#xff1a;在MANIFEST.MF里配置了Main-Class&#xff0c;可以直接执行jar文件 Main-Class: com.ming.test.Test 然后打包执行以下命令…...

光明网/网站关键词优化怎么弄

11、String s "xyz"和String s new String("xyz");区别String s new String("xyz");可能创建两个对象也可能创建一个对象。如果常量池中有hello字符串常量的话&#xff0c;则仅仅在堆中创建一个对象。如果常量池中没有hello对象&#xff0c;则…...

做的网站没有注册/关键词推广优化排名如何

环境 JDK8jenkins 2.321 安装过程 1、去官网下载&#xff1a;https://jenkins.io/zh/ 2、使用命令行安装&#xff0c;进入到该war包所在的目录 java -jar jenkins.war --httpPort5016–httpPort指定Jenkins监听的端口 出现如下的界面表示成功&#xff1a; 在浏览器里面输…...

如何给网站做提升/windows优化大师有什么功能

这里整理下mysql global status的相关命令&#xff0c;在计算监控数据的时候需要用到 一、慢查询 show variables like %slow%; ------------------------------------------------------------------ | Variable_name | Value | …...