Spring Boot 中的 @Cacheable 注解

Spring Boot 中的 @Cacheable 注解

在 Spring Boot 中,缓存是一个非常重要的话题。当我们需要频繁读取一些数据时,为了提高性能,可以将这些数据缓存起来,避免每次都从数据库中读取。为了实现缓存,Spring Boot 提供了一些缓存注解,其中最常用的是 @Cacheable 注解。

在这里插入图片描述

@Cacheable 注解是什么?

@Cacheable 注解用于标记一个方法需要被缓存。在注解中,可以指定缓存的名称和缓存的键。例如:

@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {// 从数据库中读取用户信息
}

在上面的例子中,缓存的名称是 users,缓存的键是方法的参数 id。当方法被执行时,Spring Boot 会先查找缓存,如果缓存中存在相应的数据,则直接从缓存中读取,否则执行方法并将结果缓存到缓存中。

@Cacheable 注解的原理

当一个方法被标记为 @Cacheable 注解时,Spring Boot 会先查找是否存在缓存,如果缓存中存在相应的数据,则直接从缓存中读取,否则执行方法并将结果缓存到缓存中。

在 Spring Boot 中,缓存的实现是通过缓存管理器来实现的。缓存管理器负责缓存的创建、读取、更新和删除等操作。Spring Boot 提供了多种缓存管理器的实现,例如 Ehcache、Redis、Caffeine 等。

当使用 @Cacheable 注解时,需要指定一个缓存管理器。可以通过在配置文件中配置缓存管理器,例如:

spring:cache:type: redisredis:host: localhostport: 6379password: password

在上面的例子中,使用 Redis 作为缓存管理器,设置 Redis 的主机地址、端口号和密码。可以根据实际情况进行配置。

@Cacheable 注解的使用

使用 @Cacheable 注解非常简单,只需要在方法上添加注解即可。例如:

@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {// 从数据库中读取用户信息
}

在上面的例子中,@Cacheable 注解的值为 users,表示缓存的名称是 userskey 属性为 #id,表示缓存的键是方法的参数 id。当方法被执行时,Spring Boot 会先查找缓存,如果缓存中存在相应的数据,则直接从缓存中读取,否则执行方法并将结果缓存到缓存中。

@Cacheable 注解的高级使用

在使用 @Cacheable 注解时,还可以设置一些高级属性。下面介绍几个常用的高级属性:

condition

condition 属性可以用来设置一个条件表达式,只有当表达式为 true 时,才会执行缓存。例如:

@Cacheable(value = "users", key = "#id", condition = "#id > 0")
public User getUserById(Long id) {// 从数据库中读取用户信息
}

在上面的例子中,只有当 id 大于 0 时,才会执行缓存。

unless

unless 属性可以用来设置一个条件表达式,只有当表达式为 false 时,才会执行缓存。例如:

@Cacheable(value = "users", key = "#id", unless = "#result == null")
public User getUserById(Long id) {// 从数据库中读取用户信息
}

在上面的例子中,只有当方法返回值不为空时,才会执行缓存。

sync

sync 属性可以用来设置是否启用同步缓存。当多个线程同时访问同一个缓存时,如果不启用同步缓存,则可能出现线程安全问题。可以通过设置 sync 属性为 true 来启用同步缓存。例如:

@Cacheable(value = "users", key = "#id", sync = true)
public User getUserById(Long id) {// 从数据库中读取用户信息
}

在上面的例子中,启用了同步缓存。

@Cacheable 注解的注意事项

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

  1. 缓存的名称必须唯一,否则可能会出现缓存冲突的问题。
  2. 缓存的键必须能够唯一标识一条数据,否则可能会出现缓存错误的问题。
  3. 缓存的数据类型必须与方法的返回类型相同,否则可能会出现类型转换错误的问题。
  4. 当使用缓存时,需要注意缓存的失效时间,否则可能会出现缓存数据过期的问题。

示例代码

下面是一个使用 @Cacheable 注解的示例代码:

@RestController
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/users/{id}")@Cacheable(value = "users", key = "#id")public User getUserById(@PathVariable Long id) {return userService.getUserById(id);}
}@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public User getUserById(Long id) {return userRepository.findById(id).orElse(null);}
}@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

在上面的代码中,UserController 类中的 getUserById 方法使用了 @Cacheable 注解,指定了缓存的名称为 users,缓存的键为方法的参数 id。当方法被执行时,Spring Boot 会先查找缓存,如果缓存中存在相应的数据,则直接从缓存中读取,否则执行 UserService 类中的 getUserById 方法,并将结果缓存到缓存中。

结论

在 Spring Boot 中,使用 @Cacheable 注解可以非常方便地实现缓存功能。通过设置缓存的名称和缓存的键,可以实现精细的缓存控制。同时,使用高级属性可以进一步提高缓存的灵活性和可靠性。在实际项目中,需要根据实际情况选择合适的缓存管理器和缓存失效策略,以保证缓存的正确性和性能。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线性代数高级--二次型--特征值与特征向量--特征值分解--多元函数的泰勒展开

目录 二次型 概念 示例 性质和特点 特征值与特征向量 概念 示例 注意 性质和特点 特征值分解 注意 多元函数的泰勒展开 回顾一元函数泰勒展开 多元函数的泰勒展开 二次型 概念 二次型是一个关于向量的二次多项式&#xff0c;通常用矩阵表示。 考虑一个n维向量…

有哪些免费好用的Python IDE(集成开发环境)?

工欲善其事&#xff0c;必先利其器。Python的学习过程少不了集成开发编辑环境(IDE)。这些Python IDE会提供插件、工具等帮助开发者加快使用Python开发的速度&#xff0c;提高效率。这里收集了一些对开发者非常有帮助的Python IDE(来自hittp://doc.okbase.net/havoc/archive/242…

Gitlab 双重认证和访问令牌的使用

目录 引言 1、双重认证让项目只能使用访问令牌克隆 2、创建项目访问令牌 3、创建群组访问令牌 引言 双重认证可以提高用户账户的安全性&#xff0c;防止密码泄露&#xff0c;他人随意登录。 访问令牌就相当于项目或群组的访问密码&#xff0c;有了它就可以克隆项目。同时访…

「STC8A8K64D4开发板」第2-6讲:串口通信

第2-6讲&#xff1a;串口通信 学习目的掌握USB转串口电路的原理和设计。学习STC8A8K64D4的串口通信&#xff0c;包括串口初始化、波特率计算、串口发送和接收。编写串口收发程序&#xff0c;尤其是串口接收的软件缓存处理。编写串口发送命令控制LED指示灯亮灭的程序。 硬件电路…

pikache靶场通关——SSRF攻击

文章目录 前言环境第一关、SSRF&#xff08;curl&#xff09;Step.1、http协议链接本地文件Step.2、file协议读取C盘下的配置文件Step.3、dict协议扫描内网其他主机的端口开放情况Step.4、使用burp扫描内网其他主机的端口开放情况Step.5、后端源码分析 第二关、SSRF(file_get_c…

SpringBoot小结

目录 基本介绍 SpringBoot快速入门 开发步骤 1.创建新模块 2 .创建 Controller 3 启动服务器 可能会出现的问题&#xff1a;端口被占用 解决方法&#xff1a; 1. 暴力&#xff1a;找到占用的端口号&#xff0c;并且找到对应的进程&#xff0c;杀死该进程&#xff0c;释放…

计算机网络-数据链路层上篇

目录 一、数据链路层概述 二、封装成帧 三、差错检测 &#xff08;一&#xff09;奇偶校验 &#xff08;二&#xff09;循环冗余校验CRC 四、可靠传输 &#xff08;一&#xff09;停止-等待协议SW &#xff08;二&#xff09;后退N帧协议GBN &#xff08;三&#xff…

AutoSAR系列讲解(入门篇)4.6-BSW的Watchdog功能

一、架构与术语解释 前面都挺难的吧&#xff1f;实践出真知&#xff0c;后面实践篇的时候&#xff0c;大家应该就能明白了。这一节就来讲个简单的功能------看门狗。看门狗想必大家应该都再熟悉不过了吧&#xff0c;主要就下面三层结构&#xff0c;简单明了&#xff0c;这节确实…

mac 文件批量重命名001开始

mac 文件批量重命名001开始&#xff0c;怎么操作&#xff1f;我们平时在整理办公文件的时候&#xff0c;经常需要对文件的名称进行修改&#xff0c;将文件修改为数字形式的名称&#xff0c;例如001、002、003、004......这样的形式&#xff0c;尤其是某项工作涉及非常多文件的时…

进程的基本概念解读

目录 什么是进程 PCB OS中用于管理控制的数据结构 进程控制块PCB的作用 进程控制块中的信息 前趋图 背景 作用 表示 示例 程序的顺序执行 程序顺序执行的特征 程序的并发执行 程序的并发执行的特征 例题解读 进程的三种基本状态 进程的三种状态之间的转换 进…

Spring面试题--Spring的bean的生命周期

这个问题比较困难&#xff0c;设计到了spring的底层&#xff0c;但是通过这个的学习&#xff0c;可以帮助我们了解Spring容器是如何管理和创建bean实例&#xff0c;以及方便调试和解决问题。 BeanDefinition bean的定义信息&#xff0c;Spring容器在进行实例化时&#xff0c;…

初学mybatis(二)CRUD操作及配置解析

学习回顾&#xff1a;初学mybatis&#xff08;一&#xff09; 一、namespace 1、将上面案例中的UserMapper接口改名为 UserDao&#xff1b;2、将UserMapper.xml中的namespace改为为UserDao的路径 .3、再次测试 结论&#xff1a; 配置文件中namespace中的名称为对应Mapper接口或…