当前位置: 首页 > news >正文

Spring @Cacheable缓存注解用法说明

注解Cacheable 是 Spring 框架中用于缓存数据的方法或类的注解。通过使用这个注解,你可以避免重复计算和重复获取数据,从而提高应用程序的性能。

基本用法

  • 引入依赖

确保在你的项目中引入了 Spring Cache 相关的依赖。如果你使用的是 Spring Boot,可以在 pom.xml 中添加以下依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
  • 启用缓存

在主类或配置类上使用 @EnableCaching 注解来启用缓存功能。

@SpringBootApplication
@EnableCaching
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
  • 使用 @Cacheable 注解

在需要缓存的方法上使用 @Cacheable 注解。

@Service
public class UserService {@Cacheable("lizz:users")public User getUserById(Long id) {// 模拟一个耗时的数据库查询try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}return new User(id, "John Doe");}
}
  • 配置缓存

        Spring 提供了多种缓存实现,包括内存缓存(如 ConcurrentMapCache)、第三方缓存(如 EhCache、Caffeine、Redis 等)。可以在配置文件(如 application.propertiesapplication.yml)中进行配置。

  • 使用 ConcurrentMapCache
spring:cache:type: simple
  • 使用 Redis 作为缓存
spring:cache:type: redisredis:host: 172.1.1.11port: 6379

高级用法

  • 缓存条件:condition

使用 condition 属性指定缓存条件,只换成id大于10的数据缓存

@Cacheable(value = "lizz:users", condition = "#id > 10")
public User getUserById(Long id) {// ...
}
  •  自定义缓存键

 使用 key 属性自定义缓存键。

@Cacheable(value = "users", key = "#root.methodName + #id")
public User getUserById(Long id) {// ...
}

缓存失效:@CacheEvict

  • allEntries=true:清除所有缓存数据
@CacheEvict(value = "lizz:users", allEntries = true)
public void clearCache() {// //清除全部缓存相关的其他业务操作
}
  • key = "#id" :清除缓存集合中指定key的数据
@CacheEvict(value = "lizz:users", key = "#id")
public void delUser(Long id) {//清除id缓存相关的其他业务操作
}

  • 缓存同步:@CachePut

 使用 @CachePut 注解更新缓存。

@CachePut(value = "lizz:users", key = "#user.id")
public User updateUser(User user) {// 更新用户的逻辑return user;
}

相关文章:

  • 【Web3】Web3.js 启动!并解决Web3 is not a constructor报错
  • 第十一节:学习通过动态调用application.properties参数配置实体类(自学Spring boot 3.x的第二天)
  • PostgreSQL主从同步
  • 安装node软件 文件夹里没有node_modules 包 是怎么回事
  • 突破SaaS产品运营困境:多渠道运营如何集中管理?
  • MasterLogic-200 PLC可以与Honeywell 的 DCS系统 Experion PKS、SCADA系统Experion HS 系统
  • 在不修改.gitignore的情况下,忽略个人文件的提交
  • 超简洁Django个人博客系统(适合初学者)
  • 单片机中有FLASH为啥还需要EEROM?
  • 2024年地球生态学与绿色发展国际会议 (EEGD 2024)
  • 一棵B+树可以存放多少行数据
  • 激光粒度分析仪校准过程中的注意事项与问题解决
  • Unity海面效果——4、法线贴图和高光
  • Ubuntu Server 和 Ubuntu Desktop 组合使用
  • OpenHarmony 5.0 纯血鸿蒙系统
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • [译] React v16.8: 含有Hooks的版本
  • [译]CSS 居中(Center)方法大合集
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • AHK 中 = 和 == 等比较运算符的用法
  • Angular Elements 及其运作原理
  • Java 23种设计模式 之单例模式 7种实现方式
  • Koa2 之文件上传下载
  • Promise初体验
  • supervisor 永不挂掉的进程 安装以及使用
  • Vue 重置组件到初始状态
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 浏览器缓存机制分析
  • 如何优雅地使用 Sublime Text
  • 深入浏览器事件循环的本质
  • 你对linux中grep命令知道多少?
  • PostgreSQL之连接数修改
  • 带你开发类似Pokemon Go的AR游戏
  • # Apache SeaTunnel 究竟是什么?
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (4)Elastix图像配准:3D图像
  • (C语言)球球大作战
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (原)本想说脏话,奈何已放下
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .net Signalr 使用笔记
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .vimrc 配置项
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • [Android] 修改设备访问权限
  • [Android]创建TabBar
  • [BT]BUUCTF刷题第9天(3.27)