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

Spring Cache的使用--快速上手篇

系列文章目录

分页查询–Java项目实战篇
全局异常处理–Java实战项目篇
完善登录功能–过滤器的使用
更多该系列文章请查看我的主页哦


文章目录

  • 系列文章目录
  • 前言
  • 一、Spring Cache介绍
  • 二、Spring Cache的使用
    • 1. 导入依赖
    • 2. 配置信息
    • 3. 在启动类上添加注解
    • 4. 添加注解
      • 4.1 @CachePut注解
      • 4.2 @CacheEvict注解
      • 4.3 @Cacheable注解
  • 查看Redis存入的数据
  • 总结


前言

在我们学习完Redis缓存之后,明白了为什么要使用Redis。也通过学习写代码练习时需要使用Redis进行大量的设置值、删除值、还有大量的逻辑判断将数据加入或删除Redis缓存。虽说逻辑方面也比较简单,但太过于繁琐。每个方法都得注入RedisTemplate,使用redisTemplate.opsForValue().set(phone,code,60L, TimeUnit.SECONDS)这样的代码。才能使得数据库中的数据与Redis缓存中的数据保持一致从而避免用户读到的数据是脏数据(修改前的数据,与数据库的数据不一致现象)。

然而Spring就给我们提供了Spring Cache框架,来减少这部分的麻烦。使我们的开发可以更多的关注于业务逻辑。下面这篇文章我们就来讲述这个框架的使用。


一、Spring Cache介绍

Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。
Spring Cache提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。
CacheManager是Spring提供的各种缓存技术抽象接口。

针对不同的缓存技术需要实现不同的CacheManager:

  • EhCacheCacheManager 使用EhCache作为缓存技术
  • GuavaCacheManager 使用Google的GuavaCache作为缓存技术
  • RedisCacheManager 使用Redis作为缓存技术

这里我们就用RedisCacheManager作为缓存技术来练习。

二、Spring Cache的使用

1. 导入依赖

在pom.xml文件中添加redis依赖和spring提供的cache依赖。
代码如下:

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

2. 配置信息

在application.yml文件中添加redis的一些基础信息,和连接Mysql数据库一样将基本的密码,端口等配置上去。time-to-live: 1800000的单位为秒,表示缓存中存入的数据在多少秒后清除。

代码如下:

spring:redis:host: localhostport: 6379#password:database: 0cache:redis:time-to-live: 1800000

3. 在启动类上添加注解

在启动类上添加开启缓存注解功能的注解:@EnableCaching

代码如下:

@EnableCaching //开启缓存注解功能
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class,args);log.info("项目启动成功...");}
}

4. 添加注解

4.1 @CachePut注解

@CachePut注解在执行添加操作时,将新的数据添加到Redis缓存中,以便于数据库查询的值和展示的数据一致。Redis底层执行的是set操作。

注解里的参数第一个数该缓存的名称“value”,第二个参数是设置一个key(作为缓存数据的key)。如下述代码就会将新增的这条数据添加到Redis缓存中。

    @PostMapping@CachePut(value = "setmealCache",key = "#setmealDto.categoryId+'_'+#setmealDto.status")public R<String> save(@RequestBody SetmealDto setmealDto){setmealService.saveWithDish(setmealDto);return R.success("新增套餐成功");}

4.2 @CacheEvict注解

@CacheEvict注解执行修改、删除数据操作时删除对应的所有该名称(value=值)下的缓存数据,以便于数据库查询的值和展示的数据一致。Redis底层执行的是del(删除)操作。

下次在删除修改完后查询时就会重新执行sql语句去数据库中查询数据,这样就使得数据库与缓存数据一致。

    @PutMapping@CacheEvict(value = "setmealCache",allEntries = true)public R<String> update(@RequestBody SetmealDto setmealDto){setmealService.updateWithDish(setmealDto);return R.success("修改成功");}

4.3 @Cacheable注解

@Cacheable注解和上面的参数也是相同的,将查询的数据放到Redis中,所以Redis底层代码也是做的set操作。

    @GetMapping("/list")//将返回的结果存入redis缓存中@Cacheable(value = "setmealCache",key = "#setmeal.categoryId+'_'+#setmeal.status")public R<List<Setmeal>> list(Setmeal setmeal){LambdaQueryWrapper<Setmeal> queryWrapper=new LambdaQueryWrapper<>();queryWrapper.eq(setmeal.getCategoryId()!=null,Setmeal::getCategoryId,setmeal.getCategoryId());queryWrapper.eq(setmeal.getStatus()!=null,Setmeal::getStatus,setmeal.getStatus());queryWrapper.orderByDesc(Setmeal::getUpdateTime);List<Setmeal> list = setmealService.list(queryWrapper);return R.success(list);}

查看Redis存入的数据

在Redis中我们也可以看到和我们注解中的信息能够对应的上。
如下图所示:
在这里插入图片描述

总结

这就是Spring Cache框架的简单使用,可以更加快捷的将Redis缓存中的数据存入或删除。逻辑方面也不需要我们去编写(像以前在查询时先看缓存中是否有该数据,如果有直接返回数据,没有在进行sql语句查询数据库将数据返回并且存入Redis的逻辑)。学习完spring cache框架后我们只需要在方法上加注解设置value、key的值就可以了。
心态还需努力呀~

相关文章:

Spring Cache的使用--快速上手篇

系列文章目录 分页查询–Java项目实战篇 全局异常处理–Java实战项目篇 完善登录功能–过滤器的使用 更多该系列文章请查看我的主页哦 文章目录系列文章目录前言一、Spring Cache介绍二、Spring Cache的使用1. 导入依赖2. 配置信息3. 在启动类上添加注解4. 添加注解4.1 CacheP…...

(三十八)MySQL是如何支持4种事务隔离级别的?Spring事务注解是如何设置的?

上次我们讲完了SQL标准下的4种事务隔离级别&#xff0c;平时比较多用的就是RC和RR两种级别&#xff0c;那么在MySQL中也是支持那4种隔离级别的&#xff0c;基本的语义都是差不多的 但是要注意的一点是&#xff0c;MySQL默认设置的事务隔离级别&#xff0c;都是RR级别的&#x…...

【博学谷学习记录】大数据课程-学习第八周总结

Hadoop初体验 使用HDFS 1.从Linux本地上传一个文本文件到hdfs的/目录下 #在/export/data/目录中创建a.txt文件&#xff0c;并写入数据 cd /export/data/ touch a.txt echo "hello" > a.txt #将a.txt上传到HDFS的根目录 hadoop fs -put a.txt /2.通过页面查看…...

go cobra初试

cobra开源地址 https://github.com/spf13/cobra cobra是什么 Cobra is a library for creating powerful modern CLI applications. Cobra is used in many Go projects such as Kubernetes, Hugo, and GitHub CLI to name a few. This list contains a more extensive lis…...

【react全家桶】 事件处理

文章目录03 【事件处理】1.React事件2.类式组件绑定事件3.向事件处理程序传递参数4.收集表单数据5.受控和非受控组件5.函数的柯里化03 【事件处理】 React的事件是通过onXxx属性指定事件处理函数 React 使用的是自定义事件&#xff0c;而不是原生的 DOM 事件 React 的事件是通过…...

RabbitMQ交换机(Exchanges)

目录 一、概念 二、临时队列 三、绑定 四、Fanout&#xff08;扇出交换机&#xff09; &#xff08;一&#xff09;介绍 &#xff08;二&#xff09;实战 五、Direct&#xff08;直接交换机&#xff09; &#xff08;一&#xff09;介绍 &#xff08;二&#xff09;实…...

2023年java初级面试题10道基础试水题

1、面向对象的特征有哪些方面?答&#xff1a;面向对象的特征主要有以下几个方面&#xff1a;1)抽象&#xff1a;抽象是将一类对象的共同特征总结出来构造类的过程&#xff0c;包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为&#xff0c;并不关注这些行为的细节…...

烙铁使用方法

烙铁使用 烙铁是硬件工程师最经常使用的工具之一,一把性能保持良好的烙铁能帮助我们快速进行电路调试。烙铁第一次加热时采用焊锡均匀涂覆在烙铁头上,以便去除包在烙铁头上面的氧化物。在工作中我们需要根据情况选择合适的烙铁头类型,合适的温度进行操作。完成焊接后要在烙铁…...

golang日期转换、日期增减计算、时间戳转换

// 固定日期格式format : "2006-01-02 15:04:05"// 按本地时区解析日期location, _ : time.ParseInLocation(format, "2022-02-20 11:30:00", time.Local)// 增加1年&#xff0c;三个参数分别是&#xff1a;年&#xff0c;月&#xff0c;日date : location…...

Android 多种支付方式的优雅实现

场景App 的支付流程&#xff0c;添加多种支付方式&#xff0c;不同的支付方式&#xff0c;对应的操作不一样&#xff0c;有的会跳转到一个新的webview&#xff0c;有的会调用系统浏览器&#xff0c;有的会进去一个新的表单页面&#xff0c;等等。并且可以添加的支付方式也是不确…...

算法设计与分析期末考试复习(三)

动态规划 动态规划算法与分治法类似&#xff0c;其基本思想也是将待求解问题分成若干个子问题。但是经分解得到的子问题往往不是互相独立的。在用分治法求解时&#xff0c;有些子问题被重复计算机了许多次。 如果能够保存已解决的子问题的答案&#xff0c;而在需要时再找出已求…...

ZCMU--1970: 潜伏者

Description R 国和 S 国正陷入战火之中&#xff0c;双方都互派间谍&#xff0c;潜入对方内部&#xff0c;伺机行动。  历尽艰险后&#xff0c;潜伏于 S 国的 R 国间谍小 C 终于摸清了 S 国军用密码的编码规则&#xff1a;  1&#xff0e; S 国军方内部欲发送的原信息经过加…...

containerd安装配置

containerd基本使用命令 containerd安装 容器运行时containerd安装配置 https://blog.csdn.net/rendongxingzhe/article/details/124595415 yum list | grep containerd containerd的本地CLI工具ctr命令 containerd的组件 containerd提供包括容器的运行、测试、发布和接口…...

随机森林算法(Random Forest)R语言实现

随机森林1. 使用Boston数据集进行随机森林模型构建2. 数据集划分3.构建自变量与因变量之间的公式4. 模型训练5. 寻找合适的ntree6. 查看变量重要性并绘图展示7. 偏依赖图:Partial Dependence Plot&#xff08;PDP图&#xff09;8. 训练集预测结果1. 使用Boston数据集进行随机森…...

干货 | 八条“黄金规则”解决RF电路寄生信号

PART 01 接地通孔应位于接地参考层开关处流经所布线路的所有电流都有相等的回流。耦合策略固然很多&#xff0c;不过回流通常流经相邻的接地层或与信号线路并行布置的接地。在参考层继续时&#xff0c;所有耦合都仅限于传输线路&#xff0c;一切都非常正常。不过&#xff0c;如…...

Java虚拟机之类加载学习总结

文章目录1 什么是类加载1.1 类加载的应用1.2 类加载过程1.3 类的验证1.4 类初始化顺序2 类加载时机3 类加载器3.1 类加载分类3.2 双亲委派3.3 自定义类加载器3.4 类加载器的命名空间4 打破双亲委派4.1 线程上下文类加载器4.2 自定义类加载器5 类的卸载1 什么是类加载 Java 虚拟…...

基于 vue3、vite、antdv、css 变量实现在线主题色切换

1、前言动态切换主题是一个很常见的需求. 实现方案也有很多, 如:编译多套 css 文件, 然后切换类名(需要预设主题, 不够灵活)less 在线编译(不兼容 ie, 性能较差)css 变量(不兼容 ie)但是这些基本都是针对 vue2 的, 我在网上并没有找到比较完整的解决 vue3 换肤的方案, 大多只处…...

“笨办法”学Python 3 ——练习 44 继承和组合

练习44 继承和组合 永远记住这一点&#xff1a;继承的大多数用法都可以用组合&#xff08;composition&#xff09;来简化或替换。并且无论如何都要避免多重继承。 内容提要&#xff1a; 1. 什么是继承&#xff1f; &#xff08;1&#xff09;隐式继承 &#xff08;2&#x…...

绕过安全狗拦截的SQL注入

目录 靶场环境及中间件 知识补充 判断存在注入 整形get类注入 字符型GET注入...

JAVA练习62-无重复字符的最长子串、最长回文子串

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、题目1-无重复字符的最长子串 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 二、题目2-最长回文子串 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 总…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...