当前位置: 首页 > 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层负载均…...

【Java】Java 的反射机制(一):反射概述

Java 的反射机制&#xff08;一&#xff09;&#xff1a;反射概述 1.反射概述1.1 静态语言 / 动态语言1.1.1 动态语言1.1.2 静态语言 1.2 Java Reflection1.3 Java 反射机制提供的功能1.4 反射的优点和缺陷1.5 反射相关的主要 API1.6 代码示例 2.Class 类2.1 什么是 Class 类2.…...

Monorepo pnpm 模式管理多个 web 项目

Monorepo pnpm 模式管理多个 web 项目 Monorepo pnpm 模式管理多个 web 项目项目地址git flow 工作流程pnpm workspace.npmrc初始化项目架构引入Husky规范git提交配置eslint和prettiereslint 配置prettier 配置 配置lint-staged创建项目创建shared项目全局安装 vue在 packages …...

2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者,看是有点意料之外,其实也在情理之中。

近日&#xff0c;2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者&#xff0c;这是历史上首次出现这样的情况。这项奖项原本只授予对自然现象和物质的物理学研究作出重大贡献的科学家&#xff0c;如今却将全球范围内对机器学习和神经网络的研究和开发作为了一种能…...

《深入理解 C++策略模式的变体:编程灵活性的新维度》

在 C编程的广阔领域中&#xff0c;设计模式起着至关重要的作用&#xff0c;它们为软件架构提供了可复用的解决方案。其中&#xff0c;策略模式是一种非常强大的设计模式&#xff0c;它允许算法的行为在运行时根据不同的策略进行改变。而策略模式的变体则进一步扩展了其灵活性和…...

一起体验AI动手实验,OceanBase 2024 年度发布会精彩预告

2024年OceanBase年度发布会将于10月23日在北京望京凯悦酒店举行。此次大会围绕“不止于记录”的主题&#xff0c;共同探讨当前数据库领域的前沿话题&#xff0c;包含主论坛、分论坛、AI 动手实训营、开源技术交流会等多个环节&#xff0c;诚邀全国各地的企业和开发者共同参与&a…...

Download Vmware Fusion (free for person)

1. web link ProductFiles - Support Portal - Broadcom support portal 2. Register user (Required) use your email to register a account 3. login and download note: the username is the email name....

【Java数据结构】二叉树

【本节目标】 1. 掌握树的基本概念 2. 掌握二叉树概念及特性 3. 掌握二叉树的基本操作 4. 完成二叉树相关的面试题练习 一. 树型结构 1 概念★ 树是一种 非线性 的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09;个有限结点组成一个具有层次关系的集…...

虎牙Android面试题及参考答案

给个数组,找出数组中第 k 大的数(利用快排思想 / 用小顶堆,他说可以用大顶堆?) 利用快排思想:快速排序的核心思想是分治和分区。在找数组中第 k 大的数时,每次选择一个基准元素,将数组分为两部分,左边部分小于基准元素,右边部分大于基准元素。如果基准元素最终的下标…...

C++:错误代码分析<2>

&#x1f30f;主页&#xff1a;R6bandito_ &#x1f680;所属专栏&#xff1a;C/C错误代码收集整理 源码 考虑以下代码&#xff1a; void do_some_work() {std::cout << "Do some work" << std::endl; }int main(int argc, const char* argv[]) {std::…...

怎么ping网络ip地址通不通

怎么Ping网络IP地址通不通&#xff1f;要检查网络中的IP地址是否连通&#xff0c;可以使用‌Ping命令。Ping命令通过发送ICMP&#xff08;Internet Control Message Protocol&#xff0c;因特网控制消息协议&#xff09;Echo请求报文并等待回应&#xff0c;来判断目标主机是否可…...