Spring Boot 中的 @CacheEvict 注解使用

news2024/11/18 21:40:04

Spring Boot 中的 @CacheEvict 注解

在 Spring Boot 中,缓存是提高应用性能的重要手段。为了更好地管理缓存,Spring Boot 提供了一系列的缓存注解,其中 @CacheEvict 注解用于清空缓存。

本文将介绍 @CacheEvict 注解的含义、原理以及如何使用。

在这里插入图片描述

@CacheEvict 注解的含义

@CacheEvict 注解用于清空缓存。它可以标注在方法上,表示在执行该方法后清空指定的缓存。@CacheEvict 注解有以下几个属性:

  • value:指定要清空的缓存名,与 @Cacheable 或 @CachePut 注解中的 value 属性对应;
  • key:指定要清空的缓存的 key;
  • allEntries:如果设置为 true,表示清空所有缓存,默认为 false;
  • beforeInvocation:如果设置为 true,表示在方法执行前清空缓存,默认为 false。

以下是一个简单的使用 @CacheEvict 注解的例子:

@CacheEvict(value = "myCache", key = "#id")
public void deleteById(Long id) {
    // 删除操作
}

在上面的代码中,我们定义了一个 deleteById 方法,它用于删除指定 id 的数据。在方法上使用了 @CacheEvict 注解,表示在删除操作执行后清空名为 myCache 的缓存中的 key 为 id 的缓存数据。

@CacheEvict 注解的原理

在 Spring Boot 中,缓存是通过缓存管理器(CacheManager)来实现的。当使用 @Cacheable 或 @CachePut 注解时,Spring Boot 会自动创建一个缓存对象并将其存储在缓存管理器中。而 @CacheEvict 注解则是通过删除缓存管理器中的缓存对象来实现清空缓存的功能。

Spring Boot 中的缓存管理器是一个抽象的 CacheManager 接口,它有多种实现方式,比如使用 Ehcache、Redis 等。Spring Boot 在启动时会自动根据配置文件中的信息创建相应的缓存管理器。

当使用 @CacheEvict 注解时,Spring Boot 会通过缓存管理器获取对应的缓存对象,并将缓存对象中指定的缓存数据删除。如果 allEntries 属性设置为 true,表示删除所有缓存中的数据。

当使用 beforeInvocation 属性时,@CacheEvict 注解会在方法执行前清空缓存。这意味着如果方法执行失败(比如抛出异常),缓存并不会被清空。反之,如果方法执行成功,则会清空缓存。

如何使用 @CacheEvict 注解

在使用 @CacheEvict 注解时,需要注意以下几点:

  1. @CacheEvict 注解应该标注在需要清空缓存的方法上。
  2. 必须指定要清空的缓存名(value 属性)和缓存的 key(key 属性)。
  3. allEntries 属性和 beforeInvocation 属性的默认值分别为 false 和 false,需要根据实际需求设置。
  4. key 属性可以使用 SpEL 表达式来动态生成,比如 #id 表示使用方法的参数 id 作为 key。

以下是一个简单的使用 @CacheEvict 注解的例子:

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Cacheable(value = "users", key = "#id")
    public User getUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }

    @CacheEvict(value = "users", key = "#user.id")
    public void saveUser(User user) {
        userRepository.save(user);
    }
}

在上面的代码中,我们定义了一个 UserService 类,其中 getUserById 方法用于根据 id 获取用户信息,saveUser 方法用于保存用户信息。在 getUserById 方法上使用了 @Cacheable 注解,表示将获取到的用户信息缓存起来。在 saveUser 方法上使用了 @CacheEvict 注解,表示在保存用户信息后清空缓存中 key 为 user.id的缓存数据,以便下次获取最新的数据。

在使用 @CacheEvict 注解时,需要注意缓存的粒度。如果将所有的数据都缓存起来,那么在执行 @CacheEvict 注解时会将所有的缓存数据都清空,这样会导致缓存失效的性能问题。因此,应该根据实际需求来确定缓存的粒度,以免影响应用性能。

结语

在本文中,我们介绍了 Spring Boot 中的 @CacheEvict 注解,包括它的含义、原理以及如何使用。@CacheEvict 注解是清空缓存的一种有效方式,可以帮助我们更好地管理缓存,提高应用性能。在实际开发中,我们应该根据实际需求来合理地使用缓存注解,以达到最佳的性能优化效果。

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

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

相关文章

华为云云耀云服务器L实例评测-基于华为云服务器的测试及简单配置

引言 云计算已经成为现代企业和个人的重要组成部分。在云计算市场上,华为云一直以来都以其出色的性能和服务质量而闻名。周末的时候,利用华为云云耀云服务器搭建了一个基于hexo的个人博客,我用的是2核2G的3M带宽的配置,访问起来挺…

自动化搭建(Jenkins_Docker)1

简介 目前为了搭建Android自动化构建, 包含自动打包、代码审查工具以及自动化测试的串联。如下图: 我拿到的是一个2T的一个服务器,需要在上面搭建整个环境, 整体分解如下: Java安装Jenkins安装和配置Gerrit 和 rep…

GIS前端—地图标注

GIS前端—地图标注 地图标注原理图片标注文本标注矢量图形标注 地图标注原理 地图标注是将空间位置信息点与地图关联,通过图标、窗口等形式把点相关的信息展现在地图上。地图标注是WebGIS应用的核心功能之一,在大众应用中十分常见。基于地图标注可以为用…

使用代码产生标准的软件架构图之C4

在软件开发的流程中, 软件架构图是重要的软件文档,软件架构图包含有多个层级,最常见的,有软件的整体架构和组件、类等图。 整体架构可能使用PPT或者一些绘图工具Visio来绘制组件、类等图有UML的标准, 也可以使用Visio…

【Android知识笔记】进程通信(二)

一、Binder对象是如何跨进程传递的 binder传递有哪些方式?binder在传递过程中是怎么存储的?binder对象序列化和反序列化过程?binder对象传递过程中驱动层做了什么?总结 Binder 对象的跨进程传递主要靠 Parcel 的两个关键方法 writeStrongBinder() 和

【数据结构】—堆排序以及TOP-K问题究极详解(含C语言实现)

食用指南:本文在有C基础的情况下食用更佳 🔥这就不得不推荐此专栏了:C语言 ♈️今日夜电波:ルミネセンス—今泉愛夏 1:01 ━━━━━━️💟──────── 5:05 …

[刷题记录]牛客面试笔刷TOP101(一)

牛客笔试算法必刷TOP101系列,每日更新中~(主要是记录自己的刷题,所以描述的可能不是很清楚 但如果刚好能帮助到你就更好了) 后续后头复习的时候,记得是看正解啊,别对着错的例子傻傻看了... 目录 1.合并有序链表2023.9.3 2.链表是否有环2023.9.4 3.判断链表中环的入口点 …

学Python的漫画漫步进阶 -- 第三步

学Python的漫画漫步进阶 -- 第三步 三、数字类型的数据3.1 Python中的数据类型3.2 整数类型3.3 浮点类型3.4 复数类型3.5 布尔类型3.6 数字类型的相互转换3.6.1 隐式类型的转换3.6.2 显式类型的转换 3.7 练一练3.8 数字类型的总结全部16步完成后 ,后续就是介绍项目实…

走进甄云,探寻SRM独角兽成功背后的故事

随着科技的快速发展和全球商业环境的不断变化,中国企业对灵活性、创新性、全球化和效率的需求是迫切的,数字化转型已经成为企业生存和发展的关键因素,对企业具有重要意义,是组织生存和发展的必然趋势。数字化转型涉及整个组织、多…

PMP-项目规划过程组的重要性

一、什么是项目规划过程组 规划过程组包括明确项目全部范围、定义和优化目标,并为实现目标制定行动方案的一组过程。规划过程组中的过程制定项目管理计划的组成部分,以及用于执行项目的项目文件。取决于项目本身的性质,可能需要通过多轮反馈来…

片上网络(1)概述

前言 NoC:On-Chip Networks,片上网络。 由于多核乃至众核时代的到来,用于连接它们的可扩展、低延迟、大带宽的通信结构变得至关重要。 在核心较少时,总线Bus和矩阵/交叉开关Crossbar是主要的互联结构。总线可以提供较低的传输延迟…

云原生Kubernetes:pod基础与配置

目录 一、理论 1.pod 2.pod容器分类 3.镜像拉取策略 4.pod 的重启策略 二、实验 1.Pod容器的分类 2.镜像拉取策略 三、问题 1.apiVersion 报错 2.pod v1版本资源未注册 3.格式错误 4.取行显示指定pod信息 四、总结 一、理论 1.pod (1) 概念 Pod是kubernetes中…

pgzrun 拼图游戏制作过程详解(4,5)

4. 将小拼图位置随机打乱 建立swap_Square(i,j)坐标互换函数 将Gird[i]和Gird[j] 中的小拼图信息进行互换 def swap_Square(i,j): # 两个拼图的位置互换temp_posGird[i].posGird[i].posGird[j].posGird[j].postemp_pos 导入随机数模块 import random 随机抽取…

ruoyi-nbcio移植过程中的一些问题记录

1、打包去掉测试出现 Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test 错误 在pom.xml里增加下面 去掉测试 <!--添加配置跳过测试--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId…

2023.05.27系统分析师考试案例分析及解析

案例分析真题1 阅读以下关于软件系统分析与建模的叙述&#xff0c;在纸上回答问题1至3. 说明: 某软件公司拟开发一套汽车租赁系统&#xff0c;科学安全和方便的管理租赁公司的各项业务&#xff0c;提高公司效率&#xff0c;提升利率。注册用户在使用系统镜像车辆预约时需执行…

利用Windows搭建Emby媒体库服务器,轻松实现无公网IP的远程访问

文章目录 1.前言2. Emby网站搭建2.1. Emby下载和安装2.2 Emby网页测试 3. 本地网页发布3.1 注册并安装cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar内网穿透本地设置 4.公网访问测试5.结语 1.前言 在现代五花八门的网络应用场景中&#xff0c;观看视频绝对是主力应用场景之一&…

css+js:实现tab切换线条跟随效果

目录 实现效果原理解析代码实现 实现效果 使用css和js实现一个tab切换的效果 原理解析 如上图 红色框框代表盒子,总宽度记作 totalWidth绿色框框代表每一项,宽度记作itemWidth深蓝色框框代表的是下划线,宽度记作activeWitdh 那么我们可以得到线的左边距是每一项的左边距加上…

通讯网关软件002——利用CommGate X2HTTP-U实现HTTP访问OPC UA Server

本文介绍利用CommGate X2HTTP-U实现HTTP访问OPC UA Server。CommGate X2HTTP是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;实现上位机通过HTTP来获取OPC UA Server的数据。 【解决方案】设置网关机…

c++ 中的函数指针

以下图片演示了c中函数指针的用法。如下图可见&#xff0c;把函数地址赋值给函数指针&#xff0c;用函数名或者函数名的地址&#xff0c;都可以&#xff0c;c编译器不报错。即 ptr f 和 ptr &f 都对。但准确的话&#xff0c;函数名就是地址&#xff0c;在编译时候&#x…

19 视图定义 union 是根据第一个 select 字段列表顺序,来进行 merge 的

前言 这个问题主要是 在之前存在这样的一个问题, 在生产环境上面 按照 我的直观理解, mysql 应该是根据 key 进行 merge, 所以 select 的顺序应该是 “不重要”??, 但是 结果我理解错了 然后 线上的查询也出现了问题, 发现很奇怪的问题, 明明 key01 列 是 id, 但是有一部…