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

Sping Cache 使用详解

缓存是提升应用性能的常用手段。它通过将耗时的操作结果存储起来,下次请求可以直接从缓存中获取,从而避免重复计算或查询数据库,显著减少响应时间和服务器负载。Spring 框架提供了强大的缓存抽象 Spring Cache,它简化了缓存的使用,并提供了与多种缓存技术的集成。

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

Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现,例如:

  • EHCache
  • Caffeine
  • Redis(常用)

一、Spring Cache 核心概念

Spring Cache 基于 AOP(面向切面编程)实现,其核心思想是将缓存逻辑与业务逻辑分离,通过注解或 XML 配置的方式声明缓存行为。主要组件包括:

  • @Cacheable: 触发缓存逻辑。如果缓存中有数据,则直接返回;否则执行方法并将结果放入缓存。

  • @CachePut: 无论缓存中是否存在数据,都会执行方法并将结果更新到缓存。适用于更新缓存的场景。

  • @CacheEvict: 从缓存中移除数据。可以根据 key 或条件移除指定的数据,也可以清空整个缓存。

  • @Caching: 组合多个缓存操作,例如同时使用 @Cacheable 和 @CacheEvict。

  • Cache 接口: 定义了缓存的基本操作,例如 get、put、evict 等。

  • CacheManager 接口: 管理 Cache 实例,例如创建、获取、销毁缓存。

  • 缓存提供者: Spring Cache 支持多种缓存实现,如 Ehcache、Redis(常用)、Caffeine 等。

二、Spring Boot 中使用 Spring Cache

1.添加依赖至pom.xml:

<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> <!- or other cache provider -->
</dependency>

这段代码添加了 Spring Boot 的缓存 starter 和 Redis starter。 你可以根据需要替换成其他缓存提供者,例如 Caffeine 或 Ehcache。

2.启用缓存:

在 Spring Boot 应用的入口类上添加 @EnableCaching 注解:

@SpringBootApplication
@EnableCaching
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}

@EnableCaching 注解启用 Spring Cache 功能,使 Spring 可以扫描并处理缓存相关的注解。

3.配置缓存:

可以使用 application.properties 或 application.yml 配置缓存,例如使用 Redis 作为缓存提供者:

spring:cache:type: redisredis:host: localhostport: 6379
*  这段配置指定了使用 Redis 作为缓存,并配置了 Redis 的连接信息。

4.使用缓存注解:

@Service
public class UserService {@Cacheable(value = "users", key = "#id")public User getUserById(Long id) {System.out.println("Fetching user from database...");// Simulate database queryreturn new User(id, "User " + id);}// `@Cacheable` 注解会尝试从名为 "users" 的缓存中获取 key 为 id 的数据。如果缓存命中,则直接返回缓存中的值;否则执行方法体,并将返回值缓存起来。@CachePut(value = "users", key = "#user.id")public User updateUser(User user) {System.out.println("Updating user in database...");// Simulate database updatereturn user;}// `@CachePut` 注解会强制执行方法体,并将返回值更新到名为 "users" 的缓存中,key 为 user 的 id。  这通常用于更新缓存数据。@CacheEvict(value = "users", key = "#id")public void deleteUser(Long id) {System.out.println("Deleting user from database...");// Simulate database delete}//  `@CacheEvict` 注解会从名为 "users" 的缓存中移除 key 为 id 的数据。  这通常用于删除缓存数据。@Caching(evict = {@CacheEvict(value = "users", key = "#id"),@CacheEvict(value = "users", allEntries = true)})public void deleteUserAndClearCache(Long id) {System.out.println("Deleting user from database and clearing cache...");// Simulate database delete}// `@Caching` 注解可以组合多个缓存操作。这里组合了两个 `@CacheEvict` 操作,先删除指定 id 的用户数据,然后清空整个 "users" 缓存。
}

以上代码演示了如何使用 @Cacheable、@CachePut 和 @CacheEvict 注解,并对每个方法的代码进行了详细解释。

  • getUserById 方法使用了 @Cacheable,第一次调用会执行方法体并缓存结果,后续调用相同 id 的用户会直接从缓存中获取。

  • updateUser 方法使用了 @CachePut,每次调用都会执行方法体并更新缓存。

  • deleteUser 方法使用了 @CacheEvict,根据 id 删除缓存中的用户数据。

  • deleteUserAndClearCache 方法使用了 @Caching 组合了两个 @CacheEvict 操作,删除指定用户并清空整个缓存。

三、进阶用法

  • unless 和 condition 属性: 可以根据方法返回值或参数控制是否缓存或驱逐缓存。例如 unless = "#result == null" 表示如果返回值为 null 则不缓存。

  • keyGenerator 属性: 自定义缓存 key 的生成策略。

  • cacheManager 属性: 指定使用的 CacheManager。

  • cacheResolver 属性: 动态选择使用的 Cache。

四、总结

Spring Cache 提供了一种简单而强大的缓存机制,可以显著提升 Spring Boot 应用的性能。通过合理使用缓存注解和配置,可以有效减少数据库访问和计算量,提升用户体验。本文介绍了 Spring Cache 的核心概念、使用方法和进阶用法,并对示例代码进行了详细解释,希望能够帮助读者更好地理解和应用 Spring Cache. 记住根据你的具体需求选择合适的缓存提供者和配置. 例如,对于高并发场景,Caffeine 通常是比 Redis 更好的本地缓存选择. 对于分布式应用,Redis 则更合适. 并且要注意缓存 key 的设计,避免 key 冲突和缓存雪崩等问题。感谢各位看官的观看,谢谢~

 

相关文章:

Sping Cache 使用详解

缓存是提升应用性能的常用手段。它通过将耗时的操作结果存储起来&#xff0c;下次请求可以直接从缓存中获取&#xff0c;从而避免重复计算或查询数据库&#xff0c;显著减少响应时间和服务器负载。Spring 框架提供了强大的缓存抽象 Spring Cache&#xff0c;它简化了缓存的使用…...

动手学深度学习60 机器翻译与数据集

1. 机器翻译与数据集 import os import torch from d2l import torch as d2l#save d2l.DATA_HUB[fra-eng] (d2l.DATA_URL fra-eng.zip,94646ad1522d915e7b0f9296181140edcf86a4f5)#save def read_data_nmt():"""载入“英语&#xff0d;法语”数据集"&qu…...

Python网络爬虫技术

Python网络爬虫技术详解 引言 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;又称网络蜘蛛&#xff08;Web Spider&#xff09;或网络机器人&#xff08;Web Robot&#xff09;&#xff0c;是一种按照一定规则自动抓取互联网信息的程序或脚本。它们通过遍历网页链…...

黑马程序员-redis项目实践笔记1

目录 一、 基于Session实现登录 发送验证码 验证用户输入验证码 校验登录状态 Redis代替Session登录 发送验证码修改 验证用户输入验证码 登录拦截器的优化 二、 商铺查询缓存 缓存更新策略 数据库和缓存不一致解决方案 缓存更新策略的最佳实践方案 实现商铺缓…...

ES-入门聚合查询

url 请求地址 http://192.168.1.108:9200/shopping/_search {"aggs": { //聚合操作"price_group":{ //名称,随意起名"terms":{ //分组"field": "price" //分组字段}}} } 查询出来的结果是 查询结果中价格的平均值 {&q…...

七维大脑: 探索人类认知的未来之路

七维大脑&#xff1a; 探索人类认知的未来之路 随着科技的不断发展&#xff0c;人们对于大脑的认知也在不断扩展。近年来&#xff0c;科学家们提出了一个名为“七维大脑”的概念&#xff0c;试图通过七个维度来理解人类的认知过程。这个概念的提出&#xff0c;让人们开始思考&…...

spring |Spring Security安全框架 —— 认证流程实现

文章目录 开头简介环境搭建入门使用1、认证1、实体类2、Controller层3、Service层3.1、接口3.2、实现类3.3、实现类&#xff1a;UserDetailsServiceImpl 4、Mapper层3、自定义token认证filter 注意事项小结 开头 Spring Security 官方网址&#xff1a;Spring Security官网 开…...

Django+vue自动化测试平台---正式开源!!!

自动化测试&#xff1a;接口、Web UI 与 App 的全面探索 在此郑重声明&#xff1a;本文内容未经本人同意&#xff0c;不得随意转载。若有违者&#xff0c;必将追究其法律责任。同时&#xff0c;禁止对相关源码进行任何形式的售卖行为&#xff0c;本内容仅供学习使用。 Git 地…...

电子电气架构 --- 智能网联汽车未来是什么样子?

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…...

docker安装elasticsearch(es)+kibana

目录 docker安装elasticsearch 一.准备工作 1.打开docker目录 2.创建elasticsearch目录 3.打开elasticsearch目录 4.拉取elasticsearch镜像 5.检查镜像 二.挂载目录 1.创建数据挂载目录 2.创建配置挂载目录 3.创建插件挂载目录 4.权限授权 三.编辑配置 1.打开con…...

大厂面试真题-说说redis的雪崩、击穿和穿透

缓存雪崩、击穿、穿透是缓存系统中常见的三种问题&#xff0c;它们都会对系统的性能和稳定性造成严重影响。以下是对这三种问题的详细解释以及相应的解决方案&#xff1a; 一、缓存雪崩 问题解释&#xff1a; 缓存雪崩指的是因为某些原因导致缓存中大量的数据同时失效或过期…...

【Spring】获取Cookie和Session(@CookieValue()和@SessionAttribute())

获取 Cookie 传统获取 Cookie 这是没有 Spring 的时候&#xff0c;用 Servlet 来获取&#xff08;获取所有的 Cookie&#xff09; Spring MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;也是在 Servlet 的基础上实现的 RequestMapping("/getcookie") …...

【C++打怪之路Lv8】-- string类

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;重生之我在学Linux&#xff0c;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持…...

【JS】node.js压缩文件的方式

在 Node.js 中&#xff0c;有多种方法可以压缩文件。以下是几种常见的压缩方式及其对应的代码示例&#xff1a; 使用 archiver 压缩成 ZIP 文件使用 zlib 压缩成 GZIP 文件使用 tar 压缩成 TAR 文件 1. 使用 archiver 压缩成 ZIP 文件 archiver 是一个功能强大的库&#xff…...

2024免费mac苹果电脑清理垃圾软件CleanMyMac X4.15.8

对于苹果电脑用户来说&#xff0c;设备上积累的垃圾文件可能会导致存储空间变得紧张&#xff0c;影响电脑的性能和使用体验。尤其是那些经常下载和安装新应用、编辑视频或处理大量照片的用户&#xff0c;更容易感受到存储空间的压力。面对这种情况&#xff0c;寻找一种有效的苹…...

MPA-SVM多变量回归预测|海洋捕食者优化算法-支持向量机|Matalb

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&am…...

【uni-app】HBuilderX安装uni-ui组件

目录 1、官网找到入口 2、登录帐号 3、打开HuilderX 4、选择要应用的项目 5、查看是否安装完成 6、按需安装 7、安装完毕要重启 8、应用 前言&#xff1a;uniapp项目使用uni-ui组件方式很多&#xff0c;有npm安装等&#xff0c;或直接创建uni-ui项目&#xff0c;使用un…...

ROS2 通信三大件之动作 -- Action

通信最后一个&#xff0c;也是不太容易理解的方式action&#xff0c;复杂且重要 1、创建action数据结构 创建工作空间和模块就不多说了 在模块 src/action_moudle/action/Counter.action 下创建文件 Counter.action int32 target # Goal: 目标 --- int32 current_value…...

大数据治理:构建数据驱动的智能决策体系

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

k8s微服务

一 、什么是微服务 用控制器来完成集群的工作负载&#xff0c;那么应用如何暴漏出去&#xff1f;需要通过微服务暴漏出去后才能被访问 Service是一组提供相同服务的Pod对外开放的接口。 借助Service&#xff0c;应用可以实现服务发现和负载均衡。 service默认只支持4层负载均…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...