【日积月累】SpringBoot 通过注解@CacheConfig @Cacheable @CacheEvict @CachePut @Caching使用缓存

目录

  • 1.前言
  • 2.引入依赖
  • 3.启动类加入注解@EnableCaching
  • 4.常用注解
    • 4.1@CacheConfig
    • 4.2@Cacheable
    • 4.3@CacheEvict
    • 4.4@CachePut
    • 4.5@Caching
  • 5.总结
  • 6.参考


文章所属专区 日积月累


1.前言

Spring在3.1版本,就提供了一条基于注解的缓存策略,实际使用起来还是很丝滑的,本文将针对几个常用的注解进行简单的介绍说明,有需要的小伙伴可以尝试一下

2.引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
    <version>2.1.3.RELEASE</version>
</dependency>

3.启动类加入注解@EnableCaching

@EnableCaching
public class demoWebApplication {
    public static void main(String[] args) {
        RestCrossDomainProvider.restCustomProvider();
        SpringApplication.run(GeneralWebApplication.class, args);
    }
}

4.常用注解

@CacheConfig @Cacheable @CacheEvict @CachePut @Caching

4.1@CacheConfig

@CacheConfig注解用于在类级别上配置缓存的公共属性,避免在每个缓存方法上重复配置相同的缓存属性。通过使用@CacheConfig注解,可以统一指定缓存的名称、键生成器等属性。

属性:
cacheNames :指定缓存的名称
keyGenerator :指定键生成器
tips:在Spring框架中,缓存键生成器(KeyGenerator)负责为缓存中的每个数据项生成唯一的键,用于在检索时查找数据项。默认情况下,Spring使用SimpleKeyGenerator作为缓存键生成器,它使用方法的参数作为键

@CacheConfig(cacheNames = "userCache", keyGenerator = "customKeyGenerator")
public class UserService {
    
    @Cacheable
    public User getUserById(Long userId) {
        // 从数据库中获取用户信息
        return userRepository.findById(userId);
    }
    
    @CachePut(key = "#user.id")
    public User updateUser(User user) {
        // 更新用户信息到数据库
        return userRepository.save(user);
    }
}

4.2@Cacheable

注解用于标记一个方法或类支持缓存。当该方法被调用时,Spring会先检查缓存中是否存在相应的结果,如果存在,则直接返回缓存中的结果,而不执行方法体。如果缓存中不存在结果,则执行方法体,并将结果存入缓存中供下次使用

常用于查询单条,多条数据

属性:
value:指定缓存的名称或缓存管理器的名称。可以使用cacheNames作为value的别名。如果指定了多个名称,将会使用多个缓存进行缓存操作。
key:指定缓存的键。默认情况下,Spring会根据方法的参数生成缓存键。可以使用SpEL表达式来自定义缓存键的生成方式。例如,key = "#param"表示使用方法的参数param作为缓存键。

condition:指定一个SpEL表达式,用于判断是否执行缓存操作。只有当表达式的结果为true时,才会执行缓存操作。

unless:指定一个SpEL表达式,用于判断是否不执行缓存操作。只有当表达式的结果为false时,才会执行缓存操作。与condition相反。

sync:指定是否使用同步模式进行缓存操作。默认值为false,表示使用异步模式。在异步模式下,如果多个线程同时访问同一个缓存项,可能会导致缓存穿透的问题。可以将sync设置为true来避免这个问题。

cacheManager:指定使用的缓存管理器的名称。可以通过该属性指定使用不同的缓存管理器。

cacheResolver:指定使用的缓存解析器的名称。可以通过该属性指定使用不同的缓存解析器。

keyGenerator:指定使用的缓存键生成器的名称。可以通过该属性指定使用不同的缓存键生成器。

@Cacheable(cacheNames = "blacklists", key="'listBlacklist'+'+#currentPageNum+'-'+#countPerPage+'-'+#sortField+'-'+#sortOrder+'-'+#condition",sync = true)

4.3@CacheEvict

@CacheEvict是Spring框架中的一个注解,用于从缓存中移除数据。当使用@CacheEvict注解标记一个方法时,该方法执行后会触发缓存的清除操作

常用与增删改查 旨在保证缓存的一致性和准确性

@CacheEvict(cacheNames = "theme", allEntries = true)

属性:
value:指定要清除的缓存名称或缓存管理器的名称。可以使用cacheNames作为value的别名。如果指定了多个名称,将会清除多个缓存。

key:指定要清除的缓存键。默认情况下,Spring会根据方法的参数生成缓存键。可以使用SpEL表达式来自定义缓存键的生成方式。例如,key = "#param"表示使用方法的参数param作为缓存键。

condition:指定一个SpEL表达式,用于判断是否执行缓存清除操作。只有当表达式的结果为true时,才会执行缓存清除操作。

allEntries:指定是否清除所有缓存项。默认值为false,表示只清除指定缓存键对应的缓存项。如果将allEntries设置为true,则会清除指定缓存名称或缓存管理器下的所有缓存项。

beforeInvocation:指定是否在方法执行之前清除缓存。默认值为false,表示在方法执行之后清除缓存。如果将beforeInvocation设置为true,则会在方法执行之前清除缓存,即使方法执行出现异常。

4.4@CachePut

@CachePut是Spring框架中的一个注解,用于将方法的返回值存储到缓存中。与@Cacheable注解不同的是,@CachePut注解每次都会触发方法的执行,并将结果存储到缓存中。

@CachePut(cacheNames="appTenants", key="'areaCode")

4.5@Caching

@Caching是Spring框架中的一个注解,它允许我们在一个方法或类上同时指定多个Spring缓存相关的注解。通过使用@Caching注解,我们可以灵活地定义缓存策略。

@Caching(
    cacheable = {
        @Cacheable(value = "userCache", key = "#id")
    },
    put = {
        @CachePut(value = "userCache", key = "#result.id")
    },
    evict = {
        @CacheEvict(value = "userListCache", allEntries = true)
    }
)
public User getUserById(Long id) {
    // 从数据库中获取用户信息的逻辑
    return user;
}

在上面的示例中,通过使用@Caching注解,我们同时指定了@Cacheable、@CachePut和@CacheEvict注解。当调用getUserById方法时,会先从名为"userCache"的缓存中查找对应的用户信息,如果缓存中不存在,则执行方法的逻辑,并将返回的用户信息存储到"userCache"缓存中,并且将"userListCache"缓存中的所有数据移除。

5.总结

@CacheConfig:常用于类级别的注解,用于统一配置类缓存的公共属性
@Caching:可以在一个类或方法同时使用多个缓存相关注解,灵活配置缓存策略
@Cacheable:用于标记一个类或方法,当被标记对象被访问,会先去缓存中查询相应的结果,如果存在则返回,不存在则指向方法
@CacheEvict :用于从缓存中移除数据。当使用@CacheEvict注解标记一个方法时,该方法执行后会触发缓存的清除操作
@CachePut :用于将方法的返回值存储到缓存中。与@Cacheable注解不同的是,@CachePut注解每次都会触发方法的执行,并将结果存储到缓存中

6.参考

Spring cache原理详解
什么是缓存雪崩、缓存击穿、缓存穿透?
springboot2.4.0缓存的工作原理与@Cacheable运行流程-笔记

给个三连吧 谢谢谢谢谢谢了
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Springboot---整合对象储存服务MinIO

OSS 「OSS」的英文全称是Object Storage Service&#xff0c;翻译成中文就是「对象存储服务」&#xff0c;官方一点解释就是对象存储是一种使用HTTP API存储和检索非结构化数据和元数据对象的工具。 白话文解释就是将系统所要用的文件上传到云硬盘上&#xff0c;该云硬盘提供了…

机器视觉的试卷批改系统 - opencv python 视觉识别 计算机竞赛

文章目录 0 简介1 项目背景2 项目目的3 系统设计3.1 目标对象3.2 系统架构3.3 软件设计方案 4 图像预处理4.1 灰度二值化4.2 形态学处理4.3 算式提取4.4 倾斜校正4.5 字符分割 5 字符识别5.1 支持向量机原理5.2 基于SVM的字符识别5.3 SVM算法实现 6 算法测试7 系统实现8 最后 0…

11、云服务器的宝塔面板安装、在宝塔安装MySQL、Redis、NGINX、JAVA

1►云服务器的宝塔面板安装 如果购买云服务器的时候&#xff0c;选择系统为宝塔面板&#xff0c;那么就不需要麻烦了。宝塔已经装好了。 但是如果没有选择宝塔面板&#xff0c;就需要手动安装。 第一步&#xff1a;点击重装系统 第二步&#xff1a;选择宝塔面板 宝塔面板官方…

Redis 键值类型及其存储结构

Redis 键值类型及其存储结构 键值类型 键的数据类型是字符串&#xff0c;值的类型有&#xff1a;字符串、列表、Hash、集合、有序集合。 键的存储和查找 Redis底层键的存储类似于Java中其他Hash存储结构&#xff1a;数组链表的组合。数组中存储的是Key Hash函数对数组长度取模…

制作一个模板

创建模拟对象是一种有用的技术&#xff0c;它允许您专注于应用程序的一部分&#xff0c;而不必担心系统中尚未存在的其他部分。我想设计应用程序的主页&#xff0c;我不想因为没有用户系统而分心&#xff0c;所以我只创建了一个用户对象&#xff0c;这样我就可以继续了。 应用…

Azure - 机器学习:使用自动化机器学习训练计算机视觉模型的数据架构

目录 一、用于训练的数据架构图像分类&#xff08;二进制/多类&#xff09;多标签图像分类对象检测实例分段 二、用于推理的数据格式输入格式输出格式图像分类多标签图像分类对象检测实例分段 了解如何设置Azure中 JSONL 文件格式&#xff0c;以便在训练和推理期间在计算机视觉…

集合贴2——数据

基础课10——人工智能的基础&#xff1a;大数据-CSDN博客文章浏览阅读126次。人工智能和大数据是相互依存、相互促进的关系。大数据是人工智能的重要基础&#xff0c;没有大数据&#xff0c;人工智能就难以发挥其作用。同时&#xff0c;人工智能也提供了处理和分析大数据的工具…

MCU测试科普|如何进行MCU芯片测试,具体流程是什么?

MCU芯片测试系统是一种专门用于检测MCU芯片性能和质量的综合性设备。它通常由硬件和软件两部分组成&#xff0c;硬件包括测试仪器、适配器、测试夹具等&#xff0c;用于连接被测MCU芯片和测试机&#xff0c;实现高效高精度的测试。软件部分通常包括测试程序、测试管理软件等&am…

摄像头内参准确性验证方法

前言 摄像头内参标定出来后&#xff0c;标定结果是否准确&#xff1f;有些内参准确性的验证方案需要很大的场地&#xff0c;且有很多误差源不好控制&#xff08;特别是对视野比较大的摄像头&#xff09;&#xff0c;惠州市华阳数码特电子有限公司发明了一种占用场地小测试精度…

如何开发一个求职招聘小程序?详细步骤解析与教程

一、确定需求和功能 在开发求职招聘小程序之前&#xff0c;需要明确需求和功能。通过对市场和用户需求的调研和分析&#xff0c;确定小程序需要具备哪些功能&#xff0c;如职位发布、简历投递、在线沟通、面试安排等。 二、选择开发方式 求职招聘小程序的开发方式有多种选择…

Vim编辑器学习

B站学习vim指令链接 1&#xff1a;vim下有两种模式&#xff0c;一种是命令模式&#xff0c;一种是编辑模式 2&#xff1a;命令到编辑模式&#xff0c;按键盘i&#xff0c;编辑到命令格式按Esc 3&#xff1a;&#xff1a;wq 保存并退出 &#xff1a;wq code.c保存并把文件命名为…

nginx发布vue项目

1、docker拉取nginx镜像 docker pull nginx:latest2、docker安装nginx # 第一个80端口是主机端口&#xff0c;第二个80端口是内部端口&#xff0c;主机的端口 80 映射到容器内部的端口80 docker run -d --name nginx -p 80:80 -p 443:443 nginx:lateste3、输入IP访问 说明我们…

docker形式简易部署kibana

文章目录 前言一、简易部署1.获取镜像2.启动应用4.访问页面5.总结 前言 记录下使用docker部署kibana服务的过程 一、简易部署 1.获取镜像 docker pull kibana:8.8.0[rootnginx ~]# docker pull kibana:8.8.0 8.8.0: Pulling from library/kibana Digest: sha256:a23d96ae0ae…

2023年11月在线IDE流行度最新排名

点击查看最新在线IDE流行度最新排名&#xff08;每月更新&#xff09; 2023年11月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多&#xff0c;人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…

于道 - 前端项目启动步骤参考

1. 安装 启动过程有9个步骤&#xff1a; 1.1 安装 Node JS , V18版本的 &#xff08;安装步骤省略&#xff09; 1.2 安装 npm install -g yarn &#xff0c;node JS里边好像自带npm &#xff0c;通过npm的命令安装 yarn 1.3 切换到项目中去安装&#xff0c;npm install &a…

使用决策树预测隐形眼镜类型

任务描述 本关任务&#xff1a;编写一个例子讲解决策树如何预测患者需要佩戴的隐形眼镜类型。使用小数据集&#xff0c;我们就可以利用决策树学到很多知识&#xff1a;眼科医生是如何判断患者需要佩戴的镜片类型&#xff0c;一旦理解了决策树的工作原理&#xff0c;我们甚至也…

mongodb分组查询

通过userId分组&#xff0c;得到结果字段为&#xff1a;_id和count db.my_solitaire.aggregate([{$group: {_id: "$userId", count: {$sum: 1}}}])通过userId分组得到分组字段和其他想要的字段&#xff0c;得到_id&#xff0c;userName&#xff0c;count userName 为…

【AICFD案例教程】汽车外气动-AI加速

AICFD是由天洑软件自主研发的通用智能热流体仿真软件&#xff0c;用于高效解决能源动力、船舶海洋、电子设备和车辆运载等领域复杂的流动和传热问题。软件涵盖了从建模、仿真到结果处理完整仿真分析流程&#xff0c;帮助工业企业建立设计、仿真和优化相结合的一体化流程&#x…

Assertion `srcIndex < srcSelectDimSize` failed

报错如下&#xff1a; 将设备改为CPU&#xff0c;就定位到错误了&#xff1a; Traceback (most recent call last):File "./training.py", line 713, in <module>train_body_pixel()File "./training.py", line 685, in train_body_pixeltrainer.fi…

Linux下找出吃内存的方法

几个 个 Linux 内存查看方法 1、free命令 2、 vmstat命令 3、 /proc/meminfo 命令 4、 top命令 5、 htop 命令 6、查看进程内存信息 内存性能指标 系统内存使用情况&#xff0c;比如已用内存、剩余内存、共享内存、可用内存、缓存和缓冲区的用量等。 共享内存是通过 tmp…