苍穹外卖day07缓存部分分析
苍穹外卖Day07部分聚焦于缓存功能的实现与优化,通过引入redis缓存机制,结合Spring Cache 注解,降低了数据库负载,提升其响应速度。
以下是清除缓存功能代码:
@RestController
@RequestMapping("/admin/dish")
@Slf4j
@Api("菜品相关接口")
public class DishController {@AutowiredDishService dishService;@AutowiredRedisTemplate redisTemplate;@GetMapping("/list")@ApiOperation("根据分类id查询菜品")public Result<List<DishVO>> getByCategoryId(Long categoryId) {log.info("根据分类id查询菜品");String key = "dish:" + categoryId;List<DishVO> a = (List<DishVO>) redisTemplate.opsForValue().get(key);System.out.println(a);if (a != null && a.size() > 0) {return Result.success(a);}Dish dish = new Dish();dish.setCategoryId(categoryId);dish.setStatus(StatusConstant.DISABLE);a = dishService.listWithFlavor(dish);redisTemplate.opsForValue().set(key, a);return Result.success(a);}@PostMapping("/status/{status}")@ApiOperation("菜品起售停售")public Result startOrStop(@PathVariable Integer status, Long id) {dishService.startOrStop(status,id);cleanCache();return Result.success();}private void cleanCache() {Set set = redisTemplate.keys("dish:*");redisTemplate.delete(set);}
}
在startOrStop方法中,当执行菜品起售停售操作后,会调用 cleanCache 私有方法来清理 Redis 缓存。在 cleanCache 方法里,通过 Set set = redisTemplate.keys("dish:*"); 利用 Redis 的 keys 命令获取所有以 "dish:" 开头的键值,也就是获取所有与菜品相关的缓存键,然后使用 redisTemplate.delete(set),将这些键对应的缓存数据全部删除。
这样可以确保在菜品状态发生改变后,缓存中的菜品数据能及时更新,避免前端获取到旧的不符合实际状态的菜品信息,从而保证了缓存数据与数据库数据的一致性。但是使用keys命令在生产环境中如果数据量很大可能会影响性能,因为它需要遍历所有键,可以考虑采用更精准的缓存失效策略,比如根据具体变更的菜品 id 来有针对性地删除相关缓存,而不是批量删除所有菜品缓存,也可以使用Spring Cache注解。
Spring Cache
- @EnableCaching:加在启动类上,用于开启缓存注解功能,使得项目中可以使用Spring Cache的其他注解。
- @Cacheable:放在方法上,在方法执行前先查询缓存中是否存在缓存数据,存在数据直接将数据返回;没有缓存数据,通过反射调用方法并将方法的返回值放到缓存中。
- @CachePut:将方法的返回值放到缓存中,通常用于在方法执行完毕后更新缓存中的数据。
- @CacheEvict:用于将一条或多条数据从缓存中删除,可以根据具体的 key 删除指定的缓存数据,也可以使用allEntries = true 删除整个缓存名称下的所有数据。
以下为使用spring cahce注解的代码:
@RestController
@RequestMapping("/admin/dish")
@Slf4j
@Api("菜品相关接口")
@EnableCaching
public class DishController {@AutowiredDishService dishService;@AutowiredRedisTemplate redisTemplate;@GetMapping("/list")@ApiOperation("根据分类id查询菜品")@Cacheable(cacheNames = "dishCache", key = "#categoryId")public Result<List<DishVO>> getByCategoryId(Long categoryId) {log.info("根据分类id查询菜品");Dish dish = new Dish();dish.setCategoryId(categoryId);dish.setStatus(StatusConstant.DISABLE);List<DishVO> a = dishService.listWithFlavor(dish);return Result.success(a);}@PostMapping("/status/{status}")@ApiOperation("菜品起售停售")@CacheEvict(cacheNames = "dishCache", allEntries = true)public Result startOrStop(@PathVariable Integer status, Long id) {dishService.startOrStop(status, id);return Result.success();}
}
这段代码使用@Cacheable(cacheNames = "dishCache", key = "#categoryId") 注解, cacheNames 指定了缓存的名称空间为 “dishCache”,用于将菜品相关的缓存数据统一归类管理,方便后续维护与排查问题。
key = "#categoryId" 则以传入的菜品分类 id作为缓存的键,使得在查询菜品时,系统能够依据分类 id 精准地在 “dishCache” 缓存区域中查找对应数据。当缓存中有匹配的数据时,直接返回缓存数据,不再执行方法体中的数据库查询代码,大大加快了响应速度。
相关文章:
苍穹外卖day07缓存部分分析
苍穹外卖Day07部分聚焦于缓存功能的实现与优化,通过引入redis缓存机制,结合Spring Cache 注解,降低了数据库负载,提升其响应速度。 以下是清除缓存功能代码: RestController RequestMapping("/admin/dish"…...
OCR实践-Table-Transformer
前言 书接上文 OCR实践—PaddleOCR Table-Transformer 与 PubTables-1M table-transformer,来自微软,基于Detr,在PubTables1M 数据集上进行训练,模型是在提出数据集同时的工作, paper PubTables-1M: Towards comp…...
HarmonyOS NEXT 实战之元服务:静态案例效果---电台推荐
背景: 前几篇学习了元服务,后面几期就让我们开发简单的元服务吧,里面丰富的内容大家自己加,本期案例 仅供参考 先上本期效果图 ,里面图片自行替换 效果图1完整代码案例如下: Index import { authentica…...
微信小程序 不同角色进入不同页面、呈现不同底部导航栏
遇到这个需求之前一直使用的小程序默认底部导航栏,且小程序默认入口页面为pages/index/index,要使不同角色呈现不同底部导航栏,必须要在不同页面引用不同的自定义导航栏。本篇将结合分包(subPackages)展开以下三步叙述…...
MATLAB符号计算-符号表达式基础运算操作
1.1.2符号变量取值域的限定 默认复数域 【例1-1-2】解不等式 1.1.3创建符号表达式 对符号对象进行各种运算(算术运算、关系运算、逻辑运算),即可创建符号表达式。 1.算术运算与转置 【例1-1-3】 f5是f4的共轭转置 f6是f4的转置 2.关系…...
服务器被攻击怎么办
当服务器遭受恶意流量攻击,如DDoS(分布式拒绝服务)或CC(Challenge Collapsar)攻击时,传统的防护措施可能不足以应对。此时,采用高防IP服务可以有效缓解攻击压力,确保业务连续性和数据…...
精准识别花生豆:基于EfficientNetB0的深度学习检测与分类项目
精准检测花生豆:基于EfficientNet的深度学习分类项目 在现代农业生产中,作物的质量检测和分类是确保产品质量的重要环节。针对花生豆的检测与分类需求,我们开发了一套基于深度学习的解决方案,利用EfficientNetB0模型实现高效、准…...
【UE5 C++课程系列笔记】13——GameInstanceSubsystem的简单使用
目录 概念 基本使用案例 效果 步骤 概念 UGameInstanceSubsystem 类继承自 USubsystem,它与 GameInstance 紧密关联,旨在为游戏提供一种模块化、可方便扩展和管理的功能单元机制。在整个游戏运行期间,一个 GameInstance 可以包含多个 UGa…...
实用工具推荐----Doxygen使用方法
目录 目录 1 软件介绍 2 Doxygen软件下载方法 3 Doxygen软件配置方法 4 标准注释描述 4.1 块注释 和 特殊描述字符 4.1.1 函数描述示例 4.1.2结构体数组变量示例 特别注意: 4.2单行注释 4.2.1 单个变量注释示例 特别注意: 4.2.2对于枚举变量…...
js垃圾回收机制详细讲解
JavaScript 垃圾回收机制(Garbage Collection, GC)负责自动管理内存的分配和释放,确保程序在运行时不会因为内存泄漏而崩溃。它的主要任务是回收不再使用的内存空间,防止内存泄漏。JavaScript 的垃圾回收通常由引擎自动完成&#…...
【Linux/踩坑】Linux中启动eclipse或HDFS因JAVA_HOME设置报错
Linux中启动eclipse或hadoop因JAVA_HOME设置报错 eclipseHadoop eclipse 错误提示: A Java Runtime Environment (JRE) or Java Development Kit (JDK) must be available in order to run Eclipse. No Java virtual machine was found after searching the follo…...
百度千帆平台构建AI APP的基础概念梳理
百度千帆平台构建AI APP的基础概念梳理 如果想制作大语言模型(LLM)相关的APP, 将利用百度的千帆平台在国内可能是最便捷的途径,因为百度开发了成熟的工作流,前些年还有些不稳定,现在固定下来了,…...
Unity3D Huatuo技术原理剖析详解
前言 在游戏开发领域,Unity3D凭借其强大的跨平台能力和丰富的功能,成为了众多开发者的首选工具。而在Unity3D的生态系统中,Huatuo作为一款重要的插件,为游戏开发带来了极大的便利。本文将深入剖析Huatuo的技术原理,并…...
记Fastjson2的一个报ConcurrentModificationException的bug
错误背景:fastjson2的parseObject方法,在spring webflux项目中被调用,有时会报java.util.ConcurrentModificationException错误。报错处的代码如下图: 改了半天与并发安全相关的代码,还是会报此错误。后来改变思路搜…...
使用TimesFM 对车辆销售进行预测
代码功能概述 导入相关包与设置环境变量: 首先导入了如 os、numpy、pandas 等常用的 Python 库,同时设置了一些与特定库(如 XLA_PYTHON_CLIENT_PREALLOCATE 和 JAX_PM AP_USE_TENSORSTORE)相关的环境变量,用于优化计算…...
OpenEuler 22.03 不依赖zookeeper安装 kafka 3.3.2集群
零:规划 本次计划安装三台OpenEuler 22.03 版本操作系统的服务器,用于搭建 kafka和flink 集群。因为从kafka 2.8 版本以后开始不依赖 zookeeper ,同时考虑到需要找一个发布时间早于 flink 1.17 的kafka 版本且应尽量稳定,综合考虑…...
ubuntu 将python3.8 升级为python3.10并进行版本切换
ubuntu 将python3.8 升级为python3.10并进行版本切换 前言将python3.8 升级为3.10安装pippython版本切换 前言 有一个功能包编译环境需要为python3.10 ,但是当前环境为python3.8 ,所以需要进行版本升级,编译完还需要把环境切换回来。 将pyt…...
3. Kafka入门—安装与基本命令
Kafka基础操作 一. 章节简介二. kafka简介三. Kafka安装1. 准备工作2. Zookeeper安装2.1 配置文件2.2 启动相关命令3. Kafka安装3.1 配置文件3.2 启动相关命令-------------------------------------------------------------------------------------------------------------…...
如何使用 python创建图片格式转换器
在本篇博客中,我们将通过一个简单的实例来展示如何使用 wxPython 创建一个图形用户界面(GUI)应用程序,用于将图片从一种格式转换为另一种格式。我们将通过以下几个步骤实现这一目标: C:\pythoncode\new\imageconvertty…...
命令行之巅:Linux Shell编程的至高艺术(上)
文章一览 前言一、shell概述1.1 shell的特点和类型1.1.1 **shell的特点:**1.1.2 常用shell类型 1.2 shell脚本的建立和执行1.2.1 建立shell脚本1.2.2 执行shell脚本的方式1.2.3 shell程序实例 二、shell变量与算数运算2.1 简单shell变量2.1.1 简单变量定义和赋值2.1…...
questasim2024.1 wsl2 ubuntu22.04 安装
之前一直在 wsl 2 上用 vcs 进行仿真,但是最近想看一下覆盖率,发现破解有些问题,看不了😅。而且 vcs 老给我报错说系统不兼容,让我很是恼火。开源的 verilator 的验证逻辑又和传统的工具有一些区别,不能完全…...
初创公司 0 代码上线 App:UXbot 全流程实战
非技术背景的初创公司创始人,可以使用 UXbot 这款 AI 无代码应用构建工具,在无需设计师和工程师介入的情况下,独立完成从产品需求描述到 Android APK 真机安装的完整链路。整个过程分为 5 个步骤,核心耗时约半天,输出物…...
Zenith.NET v0.0.7:Metal 后端落地,.NET GPU 抽象的跨平台旅程
为什么要做 Zenith.NET?.NET 生态有不少图形相关的库——绑定层如 Silk.NET、Vortice,抽象层如 Veldrid、Evergine。但现有的抽象层要么停留在较旧的 API 版本(如 DX11/OpenGL),要么是商业引擎的一部分,难以…...
网站目录结构对 SEO 的影响有哪些
网站目录结构对 SEO 的影响有哪些 在当前数字化时代,网站的SEO(搜索引擎优化)已成为提升网站流量和品牌影响力的关键因素。在SEO的诸多方面中,网站目录结构占据着重要地位。合理的目录结构不仅能提升用户体验,还能为搜…...
PETS5平行考试全解析:值不值得参加?我在长沙住了9天的真实体验与风险提示
PETS5平行考试全解析:值不值得参加?我在长沙住了9天的真实体验与风险提示 当PETS5考试成为留学申请路上的必经关卡时,许多考生会面临一个特殊选择:是否要参加平行考试?这个鲜为人知的选项背后,隐藏着独特的…...
一次 Spring 循环依赖源码走读:从三级缓存误用到 Bean 生命周期深度解析
在团队最近一次架构评审会上,关于 Spring 循环依赖的处理方式爆发了一场激烈争论。 “直接用 Lazy 不就行了?” 小李拍着桌子说,“我上个月在订单服务里就这么干的,上线一点问题没有。” “Lazy 只是绕开问题,不是解决…...
Memento-Skills 深度解析:当 AI 学会自己“造” AI,大模型的进化被彻底改写
Memento-Skills 深度解析:当 AI 学会自己“造” AI,大模型的进化被彻底改写当其他大模型还在云端苦苦等待下一次耗资千万的“重新训练”时,Memento-Skills 已经在你的系统里默默写代码,给自己“招聘”并设计了100个精通各个领域的…...
【uniapp】(6) uniapp中使用vuex
uniapp内置了vuex,不需要通过npm重新安装,直接引用即可1、创建 Vuex Store(1)在uniapp项目根目录下创建 store/index.jsimport Vue from vue import Vuex from vuexVue.use(Vuex)const store new Vuex.Store({//存放状态state: …...
E-Ink Launcher架构设计如何解决电子墨水屏性能瓶颈:深度解析Android启动器优化策略
E-Ink Launcher架构设计如何解决电子墨水屏性能瓶颈:深度解析Android启动器优化策略 【免费下载链接】E-Ink-Launcher E-reader Launcher for Android, Electronic paper book... 项目地址: https://gitcode.com/gh_mirrors/ei/E-Ink-Launcher E-Ink Launche…...
企业级微软产品激活管理:KMS_VL_ALL_AIO的技术实践与战略价值
企业级微软产品激活管理:KMS_VL_ALL_AIO的技术实践与战略价值 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 1. 企业激活困境与破局思路 核心价值:揭示企业在软件激活管…...
