Java缓存优化

缓存优化

环境配置

  • 配置yml文件中的redis
  • maven导入redis

缓存菜品数据

  • 先从redis获取数据,如果有直接返回;没有的话从数据库中找,把数据放入到redis中。
  • 更新菜品数据时(或者数据库中的数据变化时),需要清理缓存数据。

Spring Cache

  1. 在启动类中添加 @EnableCaching 注解,以开启缓存注解功能。这样可以在应用程序中使用缓存相关的注解。

  2. @Cacheable 会在方法执行前先检查缓存中是否有数据,如果有,则直接返回缓存中的数据;如果没有,则执行方法,并将方法返回值放入缓存中。

  3. @CachePut 可以将方法的返回值放入缓存中。该注解通常用于更新缓存数据的场景。

  4. @CacheEvict 可以从缓存中删除一条或多条数据。可以在需要删除缓存数据的方法上添加该注解,并指定要删除的缓存数据的键。

其它

在Spring缓存注解中,key是一个SpEL(Spring表达式语言)表达式,你可以使用#root#result在SpEL表达式中获取上下文数据。

  • #root:这是根对象,可以通过它访问到方法的各种元信息,如方法的名称(#root.methodName),方法的参数数组(#root.args)等。
  • #result:这是方法的返回结果,只能在@CachePut@CacheEvict(当beforeInvocation设为false)注解中使用。
@Cacheable(value = "books", key = "#root.methodName")
public Book findBookByIsbn(String isbn) {return book;
}

在这个例子中,缓存的键将会是findBookByIsbn,也就是方法的名称。

@CachePut(value = "books", key = "#isbn", condition = "#result!=null")
public Book updateBook(String isbn, Book updatedBook) {return updatedBook;
}

@CachePut

@CachePut是Spring框架中的一个注解,它可以用来更新缓存数据。该注解用在方法上,能确保方法被执行后,其结果会被存储在缓存中。
如果缓存中已存在相应的数据,那么@CachePut会使用新的结果更新缓存。

key 代表的是传递进来的对象,返回值作为缓存的value值

    @CachePut(value = "books", key = "#book.id")public Book updateBook(Book book) {return updatedBook;}

在这个示例中,@CachePut注解被用在updateBook方法上。当这个方法被调用时,它首先会更新数据库中的一本书的信息,然后将更新后的Book对象作为返回值。
@CachePut注解确保了这个更新后的Book对象会被存储在名为"books"的缓存中。缓存中的键是Book对象的id属性,值则是返回值updatedBook

使用@CachePut可以保证缓存中的数据始终与数据库中的数据保持一致。它在以下情况下非常有用:

  • 当你更改了数据库中的一条数据,并且想要立即在缓存中反映这个更改时。
  • 当你想在执行某个方法后,总是将结果存储在缓存中时。

@CacheEvict

@CacheEvict 是 Spring 框架中的一个注解,它的主要作用是在指定的缓存中删除条目,以保证缓存中的数据与数据库中的数据保持一致。

    @CacheEvict(value = "books", key = "#isbn")public void deleteBookByIsbn(String isbn) {}

在这个例子中,@CacheEvict 注解被用在 deleteBookByIsbn 方法上。当这个方法被调用的时候,它会删除数据库中的一条记录,同时也会从 “books” 这个缓存中删除相应的缓存项。

有些时候,你可能想要一次性清空整个缓存,这时候你可以使用 @CacheEvict 注解的 allEntries 属性:

    @CacheEvict(value = "books", allEntries = true)public void reloadAllBooks() {}

在这个例子中,reloadAllBooks 方法会清空 “books” 这个缓存中的所有缓存项。
需要注意的是,@CacheEvict 只会在方法成功执行后删除缓存。如果方法执行过程中抛出了异常,缓存则不会被清空或删除。

@Cacheable

@Cacheable 是 Spring 缓存注解中的一个,它用于表示某个方法的结果是可以缓存的。
当一个使用了 @Cacheable 注解的方法被调用时,Spring 会首先检查缓存中是否已经存在该方法的返回结果,如果存在,则直接返回缓存中的结果,否则,执行方法并将结果存入缓存中。

    @Cacheable(value = "books", key = "#isbn")public Book findBookByIsbn(String isbn) {return book;}

@Cacheable 的主要属性有:

  • value:用于指定缓存的名称。
  • key:用于指定缓存的键,可用于从方法的参数或其他可用数据中生成键。
  • condition:用于指定一个 SpEL 表达式,这个表达式用于决定是否应该缓存方法的结果。只有当表达式的值为 true 时,才会缓存结果。

需要注意的是,@Cacheable 只在方法第一次调用时执行实际的方法体,并将结果存入缓存,后续的调用直接从缓存中获取结果,不再执行实际的方法体。
如果方法的结果会因为外部因素(如数据库中的数据改变了)而改变,那么,这种改变不会反映到缓存的结果中。

当然,下面是一个使用 @Cacheable 注解的例子,其中包含了 condition 属性。condition 属性允许我们根据特定条件来决定是否缓存方法的结果。

    @Cacheable(value = "books", key = "#isbn", condition = "#isbn.length() == 13")public Book findBookByIsbn(String isbn) {return book;}

    @Cacheable(value = "books", key = "#isbn", condition = "#result == null")public Book findBookByIsbn(String isbn) {return book;}

所以,unlesscondition 两个属性有明显的使用场景差异:

  • condition 属性的 SpEL 表达式是在方法执行前评估的,适用于基于方法参数决定是否应用缓存的场景。
  • unless 属性的 SpEL 表达式是在方法执行后评估的,适用于基于方法返回结果决定是否应用缓存的场景。

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

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

相关文章

力扣(leetcode)第657题机器人能否返回顶点(Python)

657.机器人能否返回顶点 题目链接:657.机器人能否返回顶点 在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束。 移动顺序由字符串 moves 表示。字符 move[i] 表示其第 i 次…

第十讲_css2d转换

css2d转换 1. 移动2. 旋转3. 缩放4. 组合转换5. 设置原点 1. 移动 translate() &#xff1a;参照元素原位置&#xff0c;在X轴和Y轴方向上移动。 <html><style>.container1:hover {width: 200px;height: 200px;background-color: red;/* 在X轴方向移动50px */tra…

基于SpringBoot+Vue实现的二手交易系统

系统介绍 校园二手交易网站是一种专门针对有二手物品交易需求用户的二手交易的网站。它的设计和开发主要是为了满足用户之间的二手物品交易需求&#xff0c;方便大家在线买卖二手物品。近年来&#xff0c;随着互联网技术的发展&#xff0c;人们越来越喜欢在线购物&#xff0c;…

NMEA0183协议相关笔记

协议基本知识 参考以前的文章 <北斗/GPS模块的使用-基于正点原子ATK-1218-BD>&#xff0c;文章链接&#xff0c;或者野火相关资料整理。 1、协议格式 2、地址段指令 1、标识 2、语句类型 二、指令内容 1、 GGA 2、GLL 3、GSA 4、GSV 5、RMC 6、VTG 7、ZDA 8、TXT

码牛课堂首推——鸿蒙南北双向开发学习路线图标准版~

鸿蒙&#xff01;鸿蒙&#xff01;鸿蒙&#xff01; 要说2023-2024年IT圈最火爆的名词&#xff0c;一定是鸿蒙&#xff01; 2023年9月25日&#xff0c;华为发布会正式宣布2024年第一季度将推出HarmonyOS NEXT版本&#xff0c;这意味着鸿蒙原生应用开发将彻底摆脱Android手机系…

Vue2-子传父和父传子的基本用法

在Vue 2中&#xff0c;可以使用props和$emit来实现子组件向父组件传值&#xff08;子传父&#xff09;和父组件向子组件传值&#xff08;父传子&#xff09;。 子传父&#xff08;子组件向父组件传值&#xff09;的基本用法如下&#xff1a; 在父组件中定义一个属性&#xff…

C# Chart控件

// 定义图表区域 this.chart1.ChartAreas.Clear(); ChartArea chartArea1 new ChartArea("C1"); this.chart1.ChartAreas.Add(chartArea1); //定义存储和显示点的容器 this.chart1.Series.Clear(); Series series1 new Series("OK"); //series1.ChartAre…

Java实现在线编辑预览office文档

文章目录 1 在线编辑1.1 PageOffice简介1.2 前端项目1.2.1 配置1.2.2 页面部分 1.3 后端项目1.3.1 pom.xml1.3.2 添加配置1.3.3 controller 2 在线预览2.1 引言2.2 市面上现有的文件预览服务2.2.1 微软2.2.2 Google Drive查看器2.2.3 阿里云 IMM2.2.4 XDOC 文档预览2.2.5 Offic…

【simple-admin】FMS模块如何快速接入阿里云oss 腾讯云cos 服务 实现快速上传文件功能落地

让我们一起支持群主维护simple-admin 社群吧!!! 不能加入星球的朋友记得来点个Star!! https://github.com/suyuan32/simple-admin-core 一、前提准备 1、goctls版本 goctls官方git:https://github.com/suyuan32/goctls 确保 goctls是最新版本 v1.6.19 goctls -v goct…

在el-dialog编辑界面el-upload跳动问题

el-dialog中有子组件el-upload&#xff0c;并且做了只能显示一个文件的限制 1.在第一次打开后&#xff0c;关闭dialog&#xff0c;再打开dialog会有跳动 这是因为之前打开的dialog中&#xff0c;文件仍旧在&#xff0c;新一次的打开的文件把上一次顶掉了&#xff0c;所以产生…

【竞技宝】DOTA2:梦幻联赛开战在即 中国区前两名将晋级正赛

北京时间2024年1月12日&#xff0c;近期DOTA2刚刚结束了别墅杯东南亚/中国区的封闭预选赛&#xff0c;而别墅杯的正赛还要等到下个月才会正式开打&#xff0c;而即将在明天开始进行的是梦幻联赛S22的中国区预选赛&#xff0c;除官方直邀的XG战队直接晋级正赛之外&#xff0c;其…

Elasticsearch 7.8.0从入门到精通

安装Elasticsearch 7.8.0 官网&#xff1a;Elasticsearch 7.8.0 | Elastic 大家下载所需要的安装包即可。然后解压缩&#xff1a; Elasticsearch是通过java编写的&#xff0c;所以自带jdk。多好&#xff0c;下载Elasticsearch赠送jdk 0.0&#xff0c;不过一般我们用自己的jdk…

【第37例】IPD体系进阶:Charter开发需要回答的6个关键问题

目录 1. 内容简介 2. 6 个核心问题 作者简介 1. 内容简介 今天继续更新 IPD 进阶专栏(第37例)。 这节内容主要来谈谈 IPD Charter 开发的相关内容。 实际上来看,Charter 开发就相当于是一个产品的商业计划书。 在计划书中,会去总体上说明以下几个问题: 我们为什么做…

@PreAuthorize注解

前言&#xff1a;RuoYi框架中&#xff0c;菜单管理的权限标识字段通常用于定义用户对特定菜单或操作的访问权限。 这个权限标识字段通常会被用在两个地方&#xff1a; 1. 后端&#xff1a;在Spring Security的PreAuthorize注解中&#xff0c;用于控制对特定方法的访问。例如&am…

git撤销命令大全

1、撤销没有添加至暂存区的代码(未进行git add操作) git checkout --fileName 或者 git checkout -- .2、撤销添加至暂存区的代码(进行了git add) git reset HEAD fileName 或者 git reset HEAD .3、git commit 后撤销 (1)撤销git commit 但不撤销git add git reset…

二蛋赠书十四期:《微前端实战》

前言 大家好&#xff01;我是二蛋&#xff0c;一个热爱技术、乐于分享的工程师。在过去的几年里&#xff0c;我一直通过各种渠道与大家分享技术知识和经验。我深知&#xff0c;每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此&#xff0c;我非常感激大家一直…

51单片机点阵开发

一.LED点阵屏 LED点阵屏通过LED(发光二极管)组成&#xff0c;以灯珠亮灭来显示文字、图片、动画、视频等&#xff0c;LED点阵显示屏制作简单&#xff0c;安装方便&#xff0c;被广泛应用于各种公共场合&#xff0c;如汽车报站器、广告屏、银行窗口屏叫号屏以及停车系统等等。 …

P1094 [NOIP2007 普及组] 纪念品分组

[NOIP2007 普及组] 纪念品分组 题目背景 NOIP2007 普及组 T2 题目描述 元旦快到了&#xff0c;校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得 的纪念品价值相对均衡&#xff0c;他要把购来的纪念品根据价格进行分组&#xff0c;但每组最多只能包…

Ansible的切片特性与多机器选取

一、【概述】 本文介绍一下Ansible的多机器选取和切片特性&#xff0c;这个还是一个比较有用的技巧&#xff0c;可以快速选取仓库中我们需要的机器清单。 因为该特性可能与其他工具语法稍微有些不一样&#xff0c;时间长了会忘&#xff0c;值得记录一下 二、【具体说明】 1…

力扣(leetcode)第606题根据二叉树创建字符串(Python)

606.根据二叉树创建字符串 题目链接&#xff1a;606.根据二叉树创建字符串 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对 “()” 表示&…