在 Spring 中使用 @Cacheable 和 @CacheEvict

news2024/10/26 23:36:39

缓存是提高性能和用户体验的重要工具。Spring Framework 提供了强大的缓存抽象,使得缓存的使用变得简单高效。本文将介绍两个核心注解:@Cacheable@CacheEvict,并讨论它们的用法和注意事项。

1. @Cacheable

@Cacheable 注解用于标记方法的返回值应该被缓存。当方法被调用时,Spring 会检查缓存中是否已有结果,如果有,则直接返回缓存中的结果;如果没有,则调用方法并将结果存入缓存。

用法示例:

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Cacheable("users")
    public User findUserById(Long id) {
        // 模拟从数据库查询
        simulateSlowService();
        return new User(id, "User" + id);
    }

    private void simulateSlowService() {
        try {
            Thread.sleep(3000); // 模拟延迟
        } catch (InterruptedException e) {
            throw new IllegalStateException(e);
        }
    }
}

注意事项:

  • 需要配置缓存管理器(如 Ehcache、Redis 等)。
  • 适用于读取操作,避免缓存更新或删除带来的复杂性。
2. @CacheEvict

@CacheEvict 注解用于从缓存中移除一条或多条数据。通常在数据被修改或删除时使用,以保持缓存的一致性。

用法示例:

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @CacheEvict(value = "users", key = "#id")
    public void deleteUserById(Long id) {
        // 删除用户逻辑
    }
}

注意事项:

  • 可以使用 allEntries = true 参数,清空整个缓存。
  • 适用于删除或更新操作,确保缓存数据的准确性。
3. 结合使用

@Cacheable@CacheEvict 常常结合使用。例如,当更新用户信息时,可以先清除缓存,然后再更新数据库。

示例:

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Cacheable("users")
    public User findUserById(Long id) {
        // 从数据库查询用户
    }

    @CacheEvict(value = "users", key = "#user.id")
    public void updateUser(User user) {
        // 更新用户逻辑
    }
}
4. 总结

使用 @Cacheable@CacheEvict 注解可以极大地简化缓存管理,使得开发人员可以专注于业务逻辑。通过合理地使用这两个注解,能够提高应用的性能和用户体验。在实际应用中,确保缓存的一致性和正确性是至关重要的。

希望本文能帮助你更好地理解和使用 Spring 的缓存功能!如果有任何疑问或建议,欢迎在评论区留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2224266.html

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

相关文章

SpringBoot项目整合Knife4J

SpringBoot项目整合Knife4J 前言为什么要使用API文档什么是API文档 Knife4jKnife4j的进化史Swagger和Knife4J的关系 SpringBoot整合Knife4j版本适配实现步骤1.导入依赖2.编写配置类新建一个controller进行测试启动项目 Knife4j增强配置常用注解例子展示实体类注解Controller注解…

【大数据学习 | kafka】kafuka的基础架构

1. kafka是什么 Kafka是由LinkedIn开发的一个分布式的消息队列。它是一款开源的、轻量级的、分布式、可分区和具有复制备份的(Replicated)、基于ZooKeeper的协调管理的分布式流平台的功能强大的消息系统。与传统的消息系统相比,KafKa能够很好…

HarmonyOS 相对布局(RelativeContainer)

1. HarmonyOS 相对布局(RelativeContainer) 文档中心:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-layout-development-relative-layout-V5   RelativeContainer为采用相对布局的容器,支持容器内部的子元素设…

海螺 2.27.1 |AI生成视频 AI音乐 语音通话

嗨!我是小海螺,你的AI智能伙伴,帮助你学习工作效率加倍!我无所不知,又像朋友陪你左右,遇到问题,就问我吧。我所使用的技术,是MiniMax公司自研的万亿参数MoE大模型。我们希望能与用户…

【SpringCloud】Seata微服务事务

Seata微服务事务 分布式事务问题:本地事务分布式事务演示分布式事务问题:示例1 分布式事务理论CAP定理一致性可用性分区容错矛盾 Base理论解决分布式事务的思路 初识SeataSeata的架构部署TC服务微服务集成Seata引入依赖配置TC地址 其他服务 动手实践XA模…

WRB Hidden Gap,WRB隐藏缺口,MetaTrader 免费公式!(指标教程)

WRB Hidden Gap MetaTrader 指标用于检测和标记宽范围的柱体(非常长的柱体)或宽范围的烛身(具有非常长实体的阴阳烛)。此指标可以识别WRB中的隐藏跳空,并区分显示已填补和未填补的隐藏跳空,方便用户一眼识别…

Zustand介绍与使用 React状态管理工具

文章目录 前言基本使用编写状态加方法在组件中使用异步方法操作 中间件简化状态获取优化性能 持久化保存 前言 在现代前端开发中,状态管理一直是一个关键的挑战。随着应用规模的扩大,组件间的状态共享变得愈加复杂。为了应对这一需求,开发者…

Java-图书管理系统

我的个人主页 欢迎来到我的Java图书管理系统,接下来让我们一同探索如何书写图书管理系统吧! 1管理端和用户端 2建立相关的三个包(book、operation、user) 3建立程序入口Main类 4程序运行 1.首先图书馆管理系统分为管理员端和…

使用Poste搭建内网邮件服务器

使用Poste搭建内网邮件服务器 Poste.io 也是一个流行的邮件服务器方案,它可以通过 Docker 容器轻松部署,非常适合搭建内部邮件服务器。 本文档将向您展示如何开始使用 Poste.io 邮件服务器。在 5 分钟内,您将拥有一个可发送和接收邮件的邮件…

Springboot 使用EasyExcel导出Excel文件

Springboot 使用EasyExcel导出Excel文件 Excel导出系列目录:引入依赖创建导出模板类创建图片转化器 逻辑处理controllerservice 导出效果遗留问题 Excel导出系列目录: 【Springboot 使用EasyExcel导出Excel文件】 【Springboot 使用POI导出Excel文件】 …

基于Python大数据的王者荣耀战队数据分析及可视化系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

es实现自动补全

目录 自动补全 拼音分词器 安装拼音分词器 第一步:下载zip包,并解压缩 第二步:去docker找到es-plugins数据卷挂载的位置,并进入这个目录 第三步:把拼音分词器的安装包拖到这个目录下 第四步:重启es 第…

使用freemarker实现在线展示文档功能开发,包括数据填充

首先,在这个独属于程序员节日的这一天,祝大家节日快乐【求职的能找到心仪的工作,已经工作的工资翻倍】。 ---------------------------------------------------------------回到正文-----------------------------------------------------…

大数据处理随堂测试

HDFS MapReduce HBase Spark

【Linux驱动开发】设备树节点驱动开发入门

【Linux驱动开发】设备树节点驱动开发入门 文章目录 设备树文件设备树文件驱动开发附录:嵌入式Linux驱动开发基本步骤开发环境驱动文件编译驱动安装驱动自动创建设备节点文件 驱动开发驱动设备号地址映射,虚拟内存和硬件内存地址字符驱动旧字符驱动新字…

Redis 集群 总结

前言 相关系列 《Redis & 目录》(持续更新)《Redis & 集群 & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Redis & 集群 & 总结》(学习总结/最新最准/持续更新)《Redis & 集群…

Postman常见问题及解决方(全)

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、网络连接问题 如果Postman无法发送请求或接收响应,可以尝试以下操作: 检查网络连接是否正常,包括检查网络设置、代理设置…

接口测试(五)jmeter——get请求

一、get请求——短信验证码(示例仅供参考) 1. get请求:传参数据直接拼接在地址后面,jmeter不需要设置请求头content-type 注:短信验证码接口,返回结果中不会返回短信验证码,是存在数据库表中&a…

Pyramidal Flow使用指南:快手、北大、北邮,开源可免费商用视频生成模型,快速上手教程

什么是 Pyramidal Flow? Pyramidal Flow 是由快手科技、北京大学和北京邮电大学联合推出的开源视频生成模型,它是完全开源的,发布在 MIT 许可证下,允许商业使用、修改和再分发。该模型能够通过文本描述生成最高10秒、分辨率为128…

EveryoneNobel:为每个人打造诺贝尔奖风格的纪念图片

在这个充满荣誉和成就的时代,EveryoneNobel 项目应运而生,旨在为每个人提供一个生成诺贝尔奖风格纪念图片的机会。通过利用 ComfyUI 进行图像生成,结合 HTML 模板展示文字,不仅提供了一个生成诺贝尔奖图片的流程,而且构…