Spring Boot 中的 @Cacheable 注解

news2024/11/15 18:57:23

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: redis
    redis:
      host: localhost
      port: 6379
      password: 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 {
    @Autowired
    private UserService userService;

    @GetMapping("/users/{id}")
    @Cacheable(value = "users", key = "#id")
    public User getUserById(@PathVariable Long id) {
        return userService.getUserById(id);
    }
}

@Service
public class UserService {
    @Autowired
    private 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.coloradmin.cn/o/697672.html

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

相关文章

Apikit 自学日记:发起文档测试-TCP/UDP

进入某个TCP/UDP协议的API文档详情页&#xff0c;点击文档上方 测试 标签&#xff0c;即可进入 API 测试页&#xff0c;系统会根据API文档的定义的求头部、Query参数、请求体自动生成测试界面并且填充测试数据。 填写/修改请求参数 1.1设置请求参数 与发起HTTP协议测试类似&am…

Django Vue corsheaders跨域问题

跨域问题 记录一下在我自己的django-vue项目里面出现的跨域问题 我的项目之前一直是在本地跑的&#xff0c;因为需要上线测试&#xff0c;所以我就运行在同一个vlan里面 ip段&#xff1a;192.168.1.0/24 突然发现存在跨域问题&#xff0c;我django的接口访问被拦截了。 检查…

Web服务器群集:Nginx+Tomcat实现负载均衡与动静分离集群

目录 一、理论 1.多实例 2.Nginx负载均衡 3.Nginx动静分离 4.配置NginxTomcat负载均衡 5.配置NginxTomcat动静分离集群 6.Nginx 四层代理配置 二、实验 1.配置NginxTomcat负载均衡 2.、配置NginxTomcat动静分离集群 三、问题 1.服务器群集与集群的区别 四、总结 一…

十分钟实现 Android Camera2 视频录制

1. 前言 因为工作中要使用Android Camera2 API&#xff0c;但因为Camera2比较复杂&#xff0c;网上资料也比较乱&#xff0c;有一定入门门槛&#xff0c;所以花了几天时间系统研究了下&#xff0c;并在CSDN上记录了下&#xff0c;希望能帮助到更多的小伙伴。 上两篇文章们使用…

Python主动抛出Warning的艺术:一种提醒用户的优雅方式

简介&#xff1a;Python提供了一个内置的warnings模块&#xff0c;使得开发者可以在代码中主动地发出警告。这对于告知用户某些问题或者对某些即将废弃的特性进行提示尤其有用。本文将重点介绍如何在Python代码中主动抛出警告&#xff0c;并探讨其使用场景和优势。 历史攻略&a…

设计模式3:单例模式:volatile关键字能不能解决多线程计数问题?

先说结论不能&#xff1a; 代码实测下&#xff1a; public class Counter {public volatile static int count 0;public static void inc() {//这里延迟1毫秒&#xff0c;使得结果明显try {Thread.sleep(1);} catch (InterruptedException e) {}count;}public static void ma…

Win10安装CUDA

一、安装Nvidia显卡驱动 安装Nvidia显卡驱动前可以先检查Nvidia显卡驱动是否已安装。搜索 Nvidia控制面板 或 Nvidia Control Panel可以看到当前已经安装的显卡驱动及版本。 如需安装显卡驱动&#xff0c;在官方驱动下载网站找到自己的显卡型号对应的驱动下载并安装:官方驱动…

行业分析| 无人机电力巡检技术的应用

随着现代生活水平的不断提升&#xff0c;人们对各行各业的发展都提出了更高的品质要求&#xff0c;对于电力的需求不断上涨&#xff0c;因此也加速了电力行业的转型升级。基于这一发展状况&#xff0c;我国电力行业逐渐开始选择应用无人机电力巡检等现代高科技技术。 无人机电…

Baumer工业相机堡盟工业相机如何通过BGAPISDK进行定序器编程:VCXG双快门操作(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK进行定序器编程:VCXG双快门操作&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机BGAPISDK和定序器编程的技术背景Baumer工业相机通过BGAPISDK进行定序器编程功能1.引用合适的类文件2.Baumer工业相机通过BGAPISDK进行定序器…

Keep上市,打响健身科技第一炮?

近些年&#xff0c;大众对于身体健康和审美的需求越来越旺盛&#xff0c;因此也引发了一场无形的健身革命。无论是线下动辄大几千的健身房&#xff0c;还是线上的健身直播经济都受到了不小的关注&#xff0c;在疫情刚开始的那段时间&#xff0c;各地的封控让在线健身成为了一种…

修改滚动条样式 和 那些高度

一、滚动条样式 二、那些高度 网页可见区域宽&#xff1a; document .body.clientWidth; 网页可见区域高&#xff1a; document .body.clientHeight; 网页可见区域宽&#xff1a; document .body.offsetWidth (包括边线的宽); 网页可见区域高&#xff1a; document .body.of…

亚马逊实践 | 构建可持续发展的架构模型

可持续发展概念源于对系统性文明危机和世界问题的科学和社会意识形态研究。世界级的进步学术社群和政治精英在二十世纪末就认识到了这些问题的存在。他们将即将到来的二十一世纪视为充满不确定性、全球灾难进程逐步升级的时代。可持续发展对多个领域产生影响&#xff0c;目前已…

Sudo堆溢出漏洞(CVE-2021-3156)复现

背景介绍 2021 年 1 月 26 日&#xff0c;Qualys Research Labs在 sudo 发现了一个缺陷。sudo 解析命令行参数的方式时&#xff0c;错误的判断了截断符&#xff0c;从而导致攻击者可以恶意构造载荷&#xff0c;使得sudo发生堆溢出&#xff0c;该漏洞在配合环境变量等分配堆以及…

在Mac上安装Aspectj1.9.8(用于Java17)+IDEA

1. 确定所使用的Java版本和AspectJ的对应关系 2. 下载AspectJ包 3. 安装AspectJ 4. 添加AspectJ对应的环境变量 5. AspectJ测试-简单终端测试 6. AspectJ测试-通过IDEA敲代码测试 ---------------------------------------详细教程-------------------------------------…

【深度学习】7-0 自制框架实现DeZero - 自动微分

介绍下处理深度学习的框架DeZero&#xff0c;通过这个框架来了解自动微分是如何实现的 自动微分指的是自动求出导数的做法(技术)。“自动求出导数”是指由计算机(而非人)求出导数。具体来说&#xff0c;它是指在对某个计算(函数)编码后计算机会自动求出该计算的导数的系统。 自…

flexible.js适配pc端、移动端并自动将px转换rem

首先在assets中创建一个flexible.js文件 ;(function(win, lib) {let doc win.document;let docEl doc.documentElement;let metaEl doc.querySelector(meta[name"viewport"]);let flexibleEl doc.querySelector(meta[name"flexible"]);let dpr 0;let…

POI及EasyExcel操作xls,xlsx文件

Apache POI 是基于 Office Open XML 标准&#xff08;OOXML&#xff09;和 Microsoft 的 OLE 2 复合文档格式&#xff08;OLE2&#xff09;处理各种文件格式的开源项目。 可以使用 Java 读写 MS Excel 文件&#xff0c;可以使用 Java 读写 MS Word 和 MS PowerPoint 文件。 模…

C# 标注图片

画矩形 画四边形 保存标注图片 保存标注信息 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Drawing.Ima…

【UE5 Cesium】06-Cesium for Unreal 从一个地点飞行到另一个地点(上)

UE版本&#xff1a;5.1 介绍 本文以在墨尔本和悉尼这两个城市间为例&#xff0c;介绍如何使用虚幻5引擎和Cesium for Unreal插件在这两个城市间进行飞行移动&#xff0c;其中墨尔本和悉尼城市的倾斜摄影是Cesium官方仓库中自带的资产&#xff0c;我们引入到自己的Cesium账号…

蓝桥杯专题-试题版-【地宫取宝】【斐波那契】【波动数列】【小朋友排队】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…