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

SpringCache

针对不同的缓存技术需要实现不同的CacheManager:

在spring boot项目中,使用缓存技术只需在项目中导入相关缓存技术的依赖包,并在启动类上使用@EnableCaching开启缓存支持即可。

@CachePut注解

@CachePut 说明:

​ 作用: 将方法返回值,放入缓存

​ value: 缓存的名称, 每个缓存名称下面可以有很多key

​ key: 缓存的key ----------> 支持Spring的表达式语言SPEL语法

在save方法上加上注解 @CachePut

@CachePut(value = "userCache",key = "#user.id")@PostMappingpublic User save(User user){userService.save(user);return user;}

        

key的写法如下:

​ #user.id : #user指的是方法形参的名称, id指的是user的id属性 , 也就是使用user的id属性作为key ;

​ #user.name: #user指的是方法形参的名称, name指的是user的name属性 ,也就是使用user的name属性作为key ;

​ #result.id : #result代表方法返回值,该表达式 代表以返回对象的id属性作为key ;

​ #result.name : #result代表方法返回值,该表达式 代表以返回对象的name属性作为key ;

@CacheEvict注解

@CacheEvict 说明:

​ 作用: 清理指定缓存

​ value: 缓存的名称,每个缓存名称下面可以有多个key

​ key: 缓存的key ----------> 支持Spring的表达式语言SPEL语法

在 update 方法上加注解@CacheEvict

//@CacheEvict(value = "userCache",key = "#p0.id")   //第一个参数的id属性//@CacheEvict(value = "userCache",key = "#user.id") //参数名为user参数的id属性//@CacheEvict(value = "userCache",key = "#root.args[0].id") //第一个参数的id属性@CacheEvict(value = "userCache",key = "#result.id")  //返回值的id属性@PutMappingpublic User update(User user){userService.updateById(user);return user;}
@Cacheable注解

@Cacheable 说明:

​ 作用: 在方法执行前,spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中

​ value: 缓存的名称,每个缓存名称下面可以有多个key

​ key: 缓存的key ----------> 支持Spring的表达式语言SPEL语法

 缓存非null值

在@Cacheable注解中,提供了两个属性分别为: condition, unless 。

condition : 表示满足什么条件, 再进行缓存 

unless : 表示满足条件则不缓存 ; 与上述的condition是反向的 

/*** Cacheable:在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中* value:缓存的名称,每个缓存名称下面可以有多个key* key:缓存的key* condition:条件,满足条件时才缓存数据* unless:满足条件则不缓存*/@Cacheable(value = "userCache",key = "#id",unless = "#result == null")@GetMapping("/{id}")public User getById(@PathVariable Long id){User user = userService.getById(id);return user;}

在list方法上加注解@Cacheable

 @Cacheable(value = "userCache", key = "#user.id + '_' + #user.name")@GetMapping("/list")public List<User> list(User user){LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(user.getId() != null,User::getId,user.getId());queryWrapper.eq(user.getName() != null,User::getName,user.getName());List<User> list = userService.list(queryWrapper);return list;}

key = "#user.id + '_' + #user.name" 这种 key 的构造方式是可以自定义的,并不是固定的。这里采用了 user.iduser.name 组合成缓存 key 的方式,主要目的是为了唯一标识这个查询,确保缓存数据的准确性。你可以根据业务需求来构造不同的 key。

在实际开发中,统一 key 的定义方式有助于团队协作和代码维护,但具体的 key 内容和格式可以灵活调整。关键是要保证构造的 key 能唯一且清晰地标识对应的数据。一般来说,开发中会根据查询条件、业务逻辑、数据结构等因素来设计 key,而不是固定一种形式。

        

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 简明linux系统编程--共享内存消息队列信号量
  • Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用增强扩展(text2sql)
  • 8.sklearn-模型保存
  • VirtualBox7.1.0 安装 Ubuntu22.04.5 虚拟机
  • @JsonFormat 和 @DateTimeFormat 的区别
  • JavaScript substring() 方法
  • Redisson 分布式锁的使用详解
  • 将有序数组——>二叉搜索树
  • Leetcode 3290. Maximum Multiplication Score
  • Python 数学建模——高斯核密度估计
  • 【读书笔记-《30天自制操作系统》-22】Day23
  • vue实现二维码生成器应用
  • Kotlin cancel CoroutineScope.launch的任务后仍运行
  • CPU 和 GPU:为什么GPU更适合深度学习?
  • 模仿抖音用户ID加密ID的算法MB4E,提高自己平台ID安全性
  • Github访问慢解决办法
  • javascript 总结(常用工具类的封装)
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Just for fun——迅速写完快速排序
  • PHP的Ev教程三(Periodic watcher)
  • Sequelize 中文文档 v4 - Getting started - 入门
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • TypeScript迭代器
  • 大整数乘法-表格法
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 聚类分析——Kmeans
  • 通过几道题目学习二叉搜索树
  • 小程序 setData 学问多
  • 正则表达式-基础知识Review
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • #1014 : Trie树
  • (2)(2.10) LTM telemetry
  • (4) PIVOT 和 UPIVOT 的使用
  • (javascript)再说document.body.scrollTop的使用问题
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (八)c52学习之旅-中断实验
  • (八)Flask之app.route装饰器函数的参数
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (第二周)效能测试
  • (全注解开发)学习Spring-MVC的第三天
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (一)基于IDEA的JAVA基础1
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .dwp和.webpart的区别
  • .NET 5种线程安全集合
  • .NET CF命令行调试器MDbg入门(一)
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET 中使用 Mutex 进行跨越进程边界的同步