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

news2024/10/4 22:48:23

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 {

    @Autowired
    private DishService dishService;

    @Autowired
    private 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 {

    @Autowired
    private DishService dishService;

    @Autowired
    private 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("修改菜品")
    @PutMapping
    public Result<PageResult> update(@RequestBody DishDTO dishDTO) {
        log.info("修改菜品 参数为{}",dishDTO);
        dishService.updateDish(dishDTO);

        //删除缓存
        redisCache.deleteObject(RedisContants.DISH_CATEGORY + dishDTO.getCategoryId());
        return Result.success();
    }



    @ApiOperation("新增菜品")
    @PostMapping
    public 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("删除菜品")
    @DeleteMapping
    public 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.coloradmin.cn/o/1412412.html

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

相关文章

【JSON2WEB】02 JSON2WEB初步UI设计

JSON2WEB的UI初步设计&#xff0c;包括草图、登录、主页、导航树JSON2TREEE组件、表格JSON2GRID组件、表单JSON2FORM组件等。 1草图 表单作为抽屉从右边拉出。LOGO行和导航树为固定区域&#xff0c;导航树可以折叠。 2 登录页 找回账号&#xff1a;可以给邮箱&#xff08;找…

【Linux install】详细的Ubuntu和win双系统安装指南

文章目录 1.前期准备1.1 制作启动盘1.2关闭快速启动、安全启动、bitlocker1.2.1 原因1.2.2 进入BIOSshell命令行进入BIOSwindows设置中高级启动在开机时狂按某个键进入BIOS 1.2.3 关闭Fast boot和Secure boot 1.3 划分磁盘空间1.3.1 查看目前的虚拟内存大小 2.开始安装2.1 使用…

微信小程序(十五)自定义导航栏

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.组件文件夹创建方法 2.自定义组件的配置方法 3.外部修改组件样式&#xff08;关闭样式隔离或传参&#xff09; 创建组件文件夹 如果是手动创建建议注意在json文件声明&#xff1a; mynav.json {//声明为组件可…

git安装步骤

安装环境&#xff1a;Windows10 64bit 下载 Git网址 &#xff1a;Git - Downloading Package 版本&#xff1a;Git-2.21.0-64-bit 第一步&#xff1a;双击下载后的Git-2.21.0-64-bit.exe&#xff0c;开始安装 安装开始 第二步&#xff1a;选择安装路径&#xff0c;点击[next]…

8-小程序数据promise化、共享、分包

小程序API Promise化 wx.requet 官网入口 默认情况下&#xff0c;小程序官方异步API都是基于回调函数实现的 wx.request({method: , url: , data: {},header: {content-type: application/json // 默认值},success (res) {console.log(res.data)},fail () {},complete () { }…

CentOS7服务器的安装配置连接客户端Xshell进行使用

目录 一. CentOS7的安装【在虚拟机中】 二. 查看设置IP地址 三. 安装并连接客户端软件Xshell 3.1 安装Xshell 3.2 xshell连接centos7服务器 四. 切换国内源 一. CentOS7的安装【在虚拟机中】 首先创建一个虚拟机&#xff0c; 这个没什么好说的&#xff0c;基本上都是下…

Sketch怎么增加组件?

Sketch怎么增加组件&#xff1f;Sketch组件库经常使用&#xff0c;想要添加一些新的组件&#xff0c;该怎么添加呢&#xff1f;下面我们就来看看Sketch组件库添加新组建的技巧&#xff0c;详细请看下文介绍 打开电脑&#xff0c;找到sketch软件的图标&#xff0c;点击进入 新建…

【GitHub项目推荐--React 组件库】【转载】

这个 9.9k Star 的开源项目是一个 React 组件库帮助你更快速的构建 Web 应用&#xff0c;包含 120 可定制组件和 Hook&#xff0c;支持暗黑主题。 开源地址&#xff1a;https://github.com/mantinedev/mantine

25考研每日的时间安排

今天要给大家分享一下25考研每日的时间安排。 没有完美的计划&#xff0c;只有合适的计划。 仅供参考 很多人说复习不要只看时长而是要看效率&#xff0c;所以学多长时间不重要&#xff0c;重要的高效率完成任务。 完美的计划 这个计划看起来很完美&#xff0c;从早到晚有学习…

前端优化之代码压缩gzip

这里的代码压缩不是指的vite当中的build.minify的那个选项&#xff0c;而是指的是gzip这样的压缩方式。前者指的是格式上的压缩&#xff0c;也就是把src代码之中的空格、格式之类的全部去除掉。后者指的则是服务器对代码的一种压缩方式。 一、简要说一说服务器端对代码的压缩 …

使用Go语言编写自定义的HTTP代理:探险网络奇幻之旅

你是否曾经想过自己也能编写一个代理服务器&#xff0c;掌握网络冲浪的主动权&#xff1f;现在&#xff0c;有了Go语言&#xff0c;这个梦想不再遥不可及&#xff01;让我们一起踏上这段探险之旅&#xff0c;用Go语言编写一个自定义的HTTP代理&#xff0c;开启网络奇幻之旅&…

两个角度解决msvcr120.dll丢失的问题,修复msvcr120.dll丢失

msvcr120.dll 是 Microsoft Visual Studio 2013 的一部分&#xff0c;它属于 Visual C Redistributable Packages 的一个组件。在使用电脑的过程中是否遇到过msvcr120.dll 丢失的情况&#xff0c;约到这样的问题&#xff0c;大家是怎么解决的&#xff1f;今天教大家从两个角度去…

【操作系统】实验九 写一个设备驱动程序

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

etcd未授权到控制k8s集群

在安装完 K8s 后&#xff0c;默认会安装 etcd 组件&#xff0c;etcd 是一个高可用的 key-value 数据库&#xff0c;它为 k8s 集群提供底层数据存储&#xff0c;保存了整个集群的状态。大多数情形下&#xff0c;数据库中的内容没有加密&#xff0c;因此如果黑客拿下 etcd&#x…

数字地球开放平台农作物长势监测解决方案

数字地球开放平台农作物长势监测解决方案 利用遥感技术进行产量预测是一种高效而准确的方法&#xff0c;通过监测植被的生长状况、土地利用、气象等因素&#xff0c;可以为农业决策提供有力支持。数字地球开放平台拥有200颗卫星&#xff0c;为您提供一站式卫星遥感服务。 农情监…

Java工程师的你,真的不想了解一下《Java内存区域详解》吗?(重点)

Java工程师的你&#xff0c;真的不想了解一下《Java内存区域详解》吗&#xff1f;&#xff08;重点&#xff09; 文章目录 Java工程师的你&#xff0c;真的不想了解一下《Java内存区域详解》吗&#xff1f;&#xff08;重点&#xff09;前言运行时数据区域程序计数器Java 虚拟机…

【Unity3D日常开发】Unity3D中设置Text行首不出现标点符号

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中会遇到Text的文本内容行首出现标点符号的情况&#xf…

智云影院CMS程序PHP源码, 无需数据库,附带搭建教程

源码介绍 本程序无需数据库&#xff0c;直接上传源码即可访问&#xff0c;&#xff08;服务器或虚拟主机空间&#xff09;都可以搭建使用&#xff01;模板自适应端&#xff0c;浏览体验更佳&#xff01;安装操作简单&#xff01;无需繁琐的操作&#xff0c;即可快速拥有一个视…

HCIA学习作业二

要求&#xff1a;基于192.168.1.0/24进行合理划分&#xff0c;要求全网通 [AR3]display ip interface brief [AR3]display ip routing-table [AR1]display ip interface brief [AR1]display ip routing-table [AR2]display ip interface brief [AR2]display ip routing-tab…

解决WinForms跨线程操作控件的问题

解决WinForms跨线程操作控件的问题 介绍 在构建Windows窗体应用程序时&#xff0c;我们通常会遇到需要从非UI线程更新UI元素的场景。由于WinForms控件并不是线程安全的&#xff0c;直接这样做会抛出一个异常&#xff1a;“控件’control name’是从其他线程创建的&#xff0c;…