Redis 实际项目中的整合,记录各种用法

Redis缓存餐厅数据

我们来看主要的流程
在这里插入图片描述
很简单,就是在数据库和接口之间加了一层缓冲,在redis之前其实还可以加其他的缓存 例如 nginx的缓存

接下来,就是结合我的业务,来做缓存

在这里插入图片描述
我这里的业务逻辑是,按了分类的按钮,分别以不同的 分类为一组缓存数据
所以,这里的缓存粒度是分类
我设计的id如下

public class RedisContants {//用户端--------------------------------//分类下的菜品缓存public static final String DISH_CATEGORY = "dish:category:";}

为了体现粒度,我们操作redis key的时候,加上分类id

我们来看我已经写好的样子

在这里插入图片描述

我们需要改造的地方有几处
第一:
通过分类id获得此分类下的菜品的时候,我们要保存redis

第二:
当我们修改菜品,不管是添加 + 删除 + 修改,都要修改这里的代码
我在想其实,这里会有写耦合,redis的操作 + 数据库的操作,如果我们可以分离出来就完美了

代码

redis的工具类在我另外一个博客里边
https://blog.csdn.net/weixin_52232901/article/details/135850329

获得商品的controller修改

@RestController("userDishController")
@RequestMapping("/user/dish")
@Slf4j
@Api(tags = "菜品管理")
public class DishController {@Autowiredprivate DishService dishService;@Autowiredprivate RedisCache redisCache;@ApiOperation("根据分类id查询菜品")@GetMapping("/list")public Result getByCategoryId(Long categoryId) {log.info("根据分类id查询菜品 参数为{}",categoryId);//先去redis中查List<DishVO> dishVOs = redisCache.getCacheObject(RedisContants.DISH_CATEGORY + categoryId);if(dishVOs != null && dishVOs.size() > 0) {return Result.success(dishVOs);}//没查到redis,去mysql查,并且更新redis,设置一天的时间为过期时间dishVOs = dishService.getByCategoryIdUser(categoryId);redisCache.setCacheObject(RedisContants.DISH_CATEGORY + categoryId,dishVOs,RedisContants.DISH_CATEGORY_TTL,RedisContants.DISH_CATEGORY_TIMEUNIT);return Result.success(dishVOs);}}
    public static final String DISH_CATEGORY = "dish:category:";public static final Integer DISH_CATEGORY_TTL = 24;public static final TimeUnit DISH_CATEGORY_TIMEUNIT = TimeUnit.HOURS;

修改相关数据的controller修改

这里的修改,你们可以不用看,这里只是我的业务有相关性,所以记录下来

/*** 员工管理*/
@RestController
@RequestMapping("/admin/dish")
@Slf4j
@Api(tags = "菜品管理")
public class DishController {@Autowiredprivate DishService dishService;@Autowiredprivate RedisCache redisCache;@ApiOperation("分页查询")@GetMapping("/page")public Result<PageResult> pageQuery(DishPageQueryDTO dishPageQueryDTO) {log.info("分页查询 参数为{}",dishPageQueryDTO);PageResult page = dishService.pageQuery(dishPageQueryDTO);return Result.success(page);}@ApiOperation("根据id查询菜品")@GetMapping("/{id}")public Result getByid(@PathVariable Long id) {log.info("根据id查询菜品 参数为{}",id);DishVO dish = dishService.getByid(id);return Result.success(dish);}@ApiOperation("根据分类id查询菜品")@GetMapping("/list")public Result getByCategoryId(Long categoryId) {log.info("根据分类id查询菜品 参数为{}",categoryId);List<Dish> dish = dishService.getByCategoryId(categoryId);return Result.success(dish);}@ApiOperation("修改菜品")@PutMappingpublic Result<PageResult> update(@RequestBody DishDTO dishDTO) {log.info("修改菜品 参数为{}",dishDTO);dishService.updateDish(dishDTO);//删除缓存redisCache.deleteObject(RedisContants.DISH_CATEGORY + dishDTO.getCategoryId());return Result.success();}@ApiOperation("新增菜品")@PostMappingpublic Result<PageResult> add(@RequestBody DishDTO dishDTO) {log.info("新增菜品 参数为{}",dishDTO);dishService.addDish(dishDTO);//删除缓存redisCache.deleteObject(RedisContants.DISH_CATEGORY + dishDTO.getCategoryId());return Result.success();}@ApiOperation("修改状态")@PostMapping("/status/{status}")public Result changeStatus(@PathVariable Integer status,Long id) {log.info("修改状态 参数为{},{}",status,id);dishService.changeStatus(status,id);Dish dish = dishService.getById(id);//删除缓存redisCache.deleteObject(RedisContants.DISH_CATEGORY + dish.getCategoryId());return Result.success();}@ApiOperation("删除菜品")@DeleteMappingpublic Result delete(String ids) {log.info("删除菜品 参数为{}",ids);String[] split = ids.split(",");List<Long> list = Arrays.stream(split).map((str) -> Long.parseLong(str)).collect(Collectors.toList());dishService.deleteById(list);Collection<String> keys = redisCache.keys(RedisContants.DISH_CATEGORY + "*");//删除所有的菜品redisCache.deleteObject(keys);return Result.success();}}

这里按道理来说,其实还是要给redis这样的key要至少设置时间才行,不然就会有问题

我这里的修改,比较要注意的是,我这里的keys,我在批量删除的时候,我的业务逻辑是,直接所有的缓存都删除
也就是以 dish:category:分类id,开头的所有都要删除,所以我们需要得到所有这样的keys的集合,也就是

Collection<String> keys = redisCache.keys(RedisContants.DISH_CATEGORY + "*");

通过这个,然后直接删除,通过集合的方式,直接删除

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

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

相关文章

Jmeter性能测试: 基于JDK 21 安装 Jmeter 5.6.3

目录 一、实验 1.环境 2.JDK下载 3.Jmeter下载 4.Windows安装JDK 21 5.Windows安装Jmeter 5.6.3 6.Linux安装JDK 21 7.Linux安装Jmeter 5.6.3 二、问题 1. Linux 的profile、bashrc、bash_profile文件有哪些区别 一、实验 1.环境 &#xff08;1&#xff09;主机 表…

huggingface高速下载模型的实战代码

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

Maven讲解

介绍 Maven是一个流行的构建工具和项目管理工具&#xff0c;它主要用于Java项目的构建、依赖管理和项目报告生成。Maven通过提供一致的项目结构、自动化的构建过程和强大的依赖管理&#xff0c;简化了项目的开发和维护过程。 下面是一些Maven的主要特点和用途&#xff1a; 项…

java servlet果蔬产业监管系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web果蔬产业监管系统是一套完善的java web信息管理系统 serlvetdaobean mvc 模式开发 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主 要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5…

FreeRtos Queue (二)

本篇主要讲Queue的prvLockQueue和prvUnlockQueue 一、前言 1、prvLockQueue和prvUnlockQueue是FreeRtos内核函数&#xff0c;只能供内核调用&#xff0c;应用层无法call。 2、cTxLock和cRxLock为中断上锁计数器&#xff0c;cTxLock记录了队列上锁期间在中断里入队的数量&#…

真香一个团队协作工具部署

部署 version: "3.4"services:mongo:image: mongocontainer_name: twake-dbvolumes:- /opt/Twake/data:/data/dbnode:image: twaketech/twake-node:latestcontainer_name: twake-webports:- 3345:3000# - 8000:3000environment:- DEVproduction- SEARCH_DRIVERmong…

React16源码: React中commitAllHostEffects内部的commitDeletion的源码实现

commitDeletion 1 &#xff09;概述 在 react commit 阶段的 commitRoot 第二个while循环中调用了 commitAllHostEffects&#xff0c;这个函数不仅仅处理了新增节点&#xff0c;更新节点最后一个操作&#xff0c;就是删除节点&#xff0c;就需要调用 commitDeletion&#xff0…

SPA单页面的讲解(超级详细)

目录 一、什么是SPA 二、SPA和MPA的区别 单页应用与多页应用的区别 单页应用优缺点 三、实现一个SPA 原理 实现 hash 模式 history模式 四、题外话&#xff1a;如何给SPA做SEO SSR服务端渲染 静态化 使用Phantomjs针对爬虫处理 一、什么是SPA SPA&#xff08;sin…

基于深度学习的狗狗类别检测

探索狗狗识别技术 引言1. 数据集介绍1.1 语境1.2 内容1.3 致谢 2. 项目背景与意义3. 项目实现流程3.1 数据处理与准备3.2 环境准备与工具安装3.3 模型配置与训练3.4 模型评估与预测3.5 模型推理与部署 4. 总结 服务 引言 随着人工智能技术的不断发展&#xff0c;图像识别已成为…

mmpose 2d姿态预测值转json文件

目录 效果图: 参考 模板文件下载地址: python预测代码: 效果图: <

【驱动系列】C#获取电脑硬件显卡核心代号信息

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《驱动系列》文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点…

读懂比特币—bitcoin代码分析(七)

代码源码和逐行解读 今天来超详细的逐行解读比特币代码中的 bitcoin/src/init.cpp 文件中的函数 StartIndexBackgroundSync&#xff0c;下面是代码源码。 bool StartIndexBackgroundSync(NodeContext& node) {// Find the oldest block among all indexes.// This block …