外卖开发(六)—— 高查询量数据的缓存

外卖开发(六)—— 高查询量数据的缓存

  • 一、代码实现缓存
    • 1、查询缓存
    • 2、修改数据时删除缓存
  • 二、spring cache注解实现
    • 1、Cacaheable
    • 2、CacheEvict

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一、代码实现缓存

1、查询缓存

在查询的时候,先去redis中查找数据,如果存在则直接返回数据;否则就去数据库进行查找,并将查找结果存入redis中,并返回数据。(redis的key设置为categoryId)

@GetMapping("list")public Result<List<DishVO>> list(Long categoryId){//查询redis中是否存在数据 存在则直接去redis 否则去查数据库//构造keyString key = "dish_" + categoryId;//查询redis中是否存在数据List<DishVO> list = (List<DishVO>) redisTemplate.opsForValue().get(key);if (list !=null && list.size()>0){return Result.success(list);}//如果不存在,只能去数据库查找Dish dish = new Dish();dish.setCategoryId(categoryId);dish.setStatus(StatusConstant.ENABLE); //查询起售中的商品List<DishVO> listVO =  dishService.listWithFlavor(dish);//将数据放入redisredisTemplate.opsForValue().set(key,listVO);return Result.success(listVO);}

在这里插入图片描述

2、修改数据时删除缓存

如果数据库中数据更新,如删除、修改、增加等,需要对redis缓存进行删除,保持数据一致性。(redis的key设置为categoryId)

新增菜品中,只需对相应的数据进行删除。

 /*** 新增菜品* @param dishDTO* @return*/@PostMapping@ApiOperation("新增菜品")public Result addDish(@RequestBody DishDTO dishDTO){log.info("新增菜品:{}",dishDTO);dishService.insertDish(dishDTO);//清理缓存String key = "dish_" + dishDTO.getCategoryId();redisTemplate.delete(key);return Result.success();}

删除菜品、修改菜品涉及到复杂的数据库操作,为简化redis操作,直接删除所有redis缓存

/*** 批量删除菜品* @param ids* @return*/@DeleteMapping@ApiOperation("批量删除菜品")public Result deleteDish(@RequestParam List<Long> ids){dishService.deleteDish(ids);//删除全部redis缓存Set keys = redisTemplate.keys("dish_*");  //获取redis中所有的key——通配符dish_*获取,并删除全部redisTemplate.delete(keys);return Result.success();}

二、spring cache注解实现

Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。
Spring Cache提供了一层抽象,底层可以切换不同的缓存实现,例如:

EHCache
Caffeine
Redis

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
<version>2.7.3</version>
</dependency>

在这里插入图片描述
在这里插入图片描述

1、Cacaheable

@Cacheable(cacheNames = "setmealCache",key = "#categoryId")
@Cacheable(cacheNames = "setmealCache",key = "#setmeal.id") //如果形参是实体类对象,可以用 “. ” 来获取属性值

@Cacheable中有两个参数,第一个是cacheNames,指定了redis数据库中的key值的前半部分(通用标识),第二个是唯一标识,可以动态指定方法形参中的属性值,比如将唯一的id作为Redis的key值的的后半部分,这样就可以唯一的标识为一个redis。
总结来说,@Cacheable 中指定的参数,可以表示为:“setmealCache::#categoryId”,其中每一个冒号都代表一层,有两个冒号,且冒号中间没有东西,则表示为Empty。如下图所示

	/*** 根据分类id查询套餐* @param categoryId* @return*/@GetMapping("/list")@ApiOperation("根据分类id查询套餐")@Cacheable(cacheNames = "setmealCache",key = "#categoryId")public Result<List<Setmeal>> list(Long categoryId){    Setmeal setmeal = new Setmeal();setmeal.setCategoryId(categoryId);setmeal.setStatus(StatusConstant.ENABLE);List<Setmeal> list = setmealService.getByCategoryId(setmeal);return Result.success(list);}

在这里插入图片描述

2、CacheEvict

@CacheEvict(cacheNames = "setmealCache",key = "#setmealDTO.categoryId") 删除指定的cache,cacheName和key一起指定Redis的key
@CacheEvict(cacheNames = "setmealCache",allEntries = true) 删除cacheName下所有的cache,allEntires = true 指定为删除所有

/*** 新增套餐* @param setmealDTO* @return*/@PostMapping@ApiOperation("新增套餐")@CacheEvict(cacheNames = "setmealCache",key = "#setmealDTO.categoryId")public Result insertSetmeal(@RequestBody SetmealDTO setmealDTO){setmealService.addSetmeal(setmealDTO);return Result.success();}
/*** 修改套餐* @param setmealDTO* @return*/@PutMapping@ApiOperation("修改套餐")@CacheEvict(cacheNames = "setmealCache",allEntries = true)public Result update(@RequestBody SetmealDTO setmealDTO){setmealService.update(setmealDTO);return Result.success();}

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

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

相关文章

VAS1260Q奇力LED驱动芯片DCDC降压恒流

VAS1260Q是一款专为车规级LED照明设计的连续模式电感降压驱动器&#xff0c;能够高效地驱动单个或多个串联LED。它集成了高端输出电流检测电路&#xff0c;并通过外部电阻设置标称平均输出电流&#xff0c;具有高可靠性和宽广的应用场景。 核心技术参数 1. 输入…

移动端使用REM插件postcss之postcss-px2rem

目录 一、概念 二、核心特性 三、功能 四、插件模块 注意事项&#xff1a; 五、使用 安装&#xff1a; 配置 一、概念 工具类型&#xff1a;PostCSS是一个基于JavaScript的工具&#xff0c;用于转换CSS的工作流。核心理念&#xff1a;PostCSS的核心理念是“转换而非替…

渗透测试:网络安全的深度探索

一、引言 在当今数字化时代&#xff0c;网络安全问题日益凸显。企业和组织面临着来自各种恶意攻击者的威胁&#xff0c;他们试图窃取敏感信息、破坏系统或进行其他恶意活动。渗透测试作为一种主动的安全评估方法&#xff0c;能够帮助企业发现潜在的安全漏洞&#xff0c;提高网…

JS听到了强运的回响

正则表达式 介绍 正则表达式是用于匹配字符串中字符组合的模式&#xff0c;在JS中&#xff0c;正则表达式也是对象 通常用来查找&#xff0c;替换那些符合正则表达式的文本 就是筛选出符合条件的一类人 比如说 有人喜欢玩艾斯爱慕&#xff0c;那他喜欢的就是这一类人&…

文件的操作

什么是文件 如何是数据持久化——保存在硬盘上(文件&#xff0c;数据库)磁盘上的文件是文件在程序设计中&#xff0c;我们一般谈的文件有两种&#xff1a;程序文件、数据文件程序文件&#xff0c;比如源文件&#xff08;.c文件&#xff09;读a文件写到b文件里&#xff0c;此时a…

【18. 自定义类型:结构体类型】

文章目录 一、结构体类型的声明1.1 结构体回顾1.1.1 结构的声明1.1.2 结构体变量的创建和初始化 1.2 结构的特殊声明1.3 结构的⾃引⽤ 2. 结构体变量的创建和初始化2.1 对⻬规则2.2 为什么存在内存对⻬?2.3 修改默认对⻬数 3. 结构成员访问操作符3. 结构体传参 4. 结构体内存对…

疯狂原始人

With every sun comes a new day. 每每旭日东升 A new beginning. 都是崭新的开始 A hope that things will be better today than they were yesterday. 总是期冀今日之美远胜昨日 But not for me. My names Eep. 但不属于我 我叫小伊 And this is my family. The Crood…

【D3.js in Action 3 精译_043】5.1 饼图和环形图的创建(三):圆弧的绘制

当前内容所在位置&#xff1a; 第五章 饼图布局与堆叠布局 ✔️ 5.1 饼图和环形图的创建 ✔️ 5.1.1 准备阶段&#xff08;一&#xff09;5.1.2 饼图布局生成器&#xff08;二&#xff09;5.1.3 圆弧的绘制&#xff08;三&#xff09; ✔️5.1.4 数据标签的添加&#xff08;四&…

【C++】LeetCode:LCR 022. 环形链表 II

题目&#xff1a; 给定一个链表&#xff0c;返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点。如果链表无环&#xff0c;则返回 null。 为了表示给定链表中的环&#xff0c;我们使用整数 pos 来表示链表尾连接到链表中的位…

Windows环境中Python脚本开机自启动及其监控自启动

1 开机自启动 Windows 10/Windows Server 201X具有一个名为“启动”的已知文件夹&#xff0c;系统每次启动开始自动运行应用程序、快捷方式和脚本时都会检查该文件夹&#xff0c;而无需额外配置。 要在Windows启动时运行脚本&#xff0c;先使用WindowsR快捷键打开“运行”对话…

【QNX+Android虚拟化方案】132 - QNX 系统内存、CPU负载监控

【QNX+Android虚拟化方案】132 - QNX 系统内存、CPU负载监控 1. 获取 showmem 信息2. 获取 thermal adc sensor 信息3. 获取 CPU Load负载信息4. 获取 CPU Freq 频率信息5. 获取 系统开机时间 uptime基于原生纯净代码,自学总结 纯技术分享,不会也不敢涉项目、不泄密、不传播代…

基于JavaSwing的贪吃蛇项目(最新项目)

Java贪吃蛇游戏 目录 文章目录 Java贪吃蛇游戏目录第一章 项目概述1.1 设计背景1.2 设计目的1.3 开发环境 第二章 需求分析2.1 功能需求2.1.1 基础功能2.1.2 扩展功能 2.2 性能需求2.3 用户体验需求 第三章 概要设计3.1 系统架构3.1.1 总体架构3.1.2 类设计 3.2 核心算法设计3…

SpringBoot 赋能:精铸超稳会员制医疗预约系统,夯实就医数据根基

1绪论 1.1开发背景 传统的管理方式都在使用手工记录的方式进行记录&#xff0c;这种方式耗时&#xff0c;而且对于信息量比较大的情况想要快速查找某一信息非常慢&#xff0c;对于会员制医疗预约服务信息的统计获取比较繁琐&#xff0c;随着网络技术的发展&#xff0c;采用电脑…

golang 协程泄漏、协程退出时机、main函数

父协程中生成子协程 问题&#xff1a;如果在一个父goroutine中生成了子goroutine&#xff0c;请问如果父goroutine先执行完毕&#xff0c;那么子协程会自动退出吗&#xff1f; 答案是&#xff1a;不会 先给出结论&#xff1a; 主协程执行完毕后&#xff0c;子协程会继续执行&a…

基于FPGA的智能电子密码指纹锁(开源全免)

基于FPGA的智能电子密码指纹锁 一、功能描述硬件资源需求 二、整体框架知识准备AS608指纹模块4*4数字键盘模块 三、Verilog代码实现以及仿真验证1.AS608_data模块2.check_hand模块3.four_four_key模块4.check_mima模块5.change_mima模块6.seg_ctrl模块7.uart_top模块8.key_debo…

动态计算加载图片

学习啦 别名路径&#xff1a;①npm install path --save-dev②配置 // vite.config,js import { defineConfig } from vite import vue from vitejs/plugin-vueimport { viteStaticCopy } from vite-plugin-static-copy import path from path export default defineConfig({re…

精确的单向延迟测量:使用普通硬件和软件

论文标题&#xff1a;Precise One-way Delay Measurement with Common Hardware and Software&#xff08;精确的单向延迟测量&#xff1a;使用普通硬件和软件&#xff09; 作者信息&#xff1a;Maciej Muehleisen 和 Mazen Abdel Latif&#xff0c;来自Ericsson Research Eri…

基于Java+Swing+Mysql的网络聊天室

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

Linux-音频应用编程

ALPHA I.MX6U 开发板支持音频&#xff0c;板上搭载了音频编解码芯片 WM8960&#xff0c;支持播放以及录音功能&#xff01;本章我们来学习 Linux 下的音频应用编程&#xff0c;音频应用编程相比于前面几个章节所介绍的内容、其难度有所上升&#xff0c;但是笔者仅向大家介绍 Li…

vue3 项目搭建-9-通过 router 在跳转页面时传参

第一步&#xff0c;在跳转链接处挂载方法&#xff0c;将要传输的数据传入&#xff1a; <a href"#" click.prevent"goToArticle(obj.id)" class"click"><h1>{{obj.title}}</h1><p>作者&#xff1a;{{obj.author}}</p&…