《苍穹外卖》知识梳理6-缓存商品,购物车功能

news2025/1/24 2:30:42

苍穹外卖实操笔记六—缓存商品,购物车功能

一.缓存菜品

  可以使用redis进行缓存;另外,在实现缓存套餐时可以使用spring cache提高开发效率;
  通过缓存数据,降低访问数据库的次数;
在这里插入图片描述
使用的缓存逻辑:
1.每个分类下保存一份缓存数据;就是一对key-value(dish_1表示属于分类1的菜品列表)
2.数据库中的菜品有变更时,及时清理缓存数据;
在这里插入图片描述

1.1缓存菜品数据;直接使用redis即可;
@RestController("userDishController")
@RequestMapping("/user/dish")
@Slf4j
@Api(tags = "C端-菜品浏览接口")
public class DishController {

    @Autowired
    private DishService dishService;

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 根据分类id查询菜品
     *
     * @param categoryId
     * @return
     */
    @GetMapping("/list")
    @ApiOperation("根据分类id查询菜品")
    public Result<List<DishVO>> list(Long categoryId) {
        //构造redis中的key
        String key="dish_"+categoryId;
        //查询redis中是否存在菜品
        List<DishVO> dishVOList = (List<DishVO>) redisTemplate.opsForValue().get(key);
        //如果存在,直接返回,无需访问数据库
        if (dishVOList!=null&&dishVOList.size()>0){
            return Result.success(dishVOList);
        }

        Dish dish = new Dish();
        dish.setCategoryId(categoryId);
        dish.setStatus(StatusConstant.ENABLE);//查询起售中的菜品

        //如果不存在,查询数据库,将查询到数据放入redis中
        dishVOList = dishService.listWithFlavor(dish);
        redisTemplate.opsForValue().set(key,dishVOList);

        return Result.success(dishVOList);
    }

}
1.2清理缓存菜品数据

新增菜品,修改菜品,批量删除菜品,起售,停售菜品都需要清理缓存数据;

二.缓存购物车

2.1 spring-cache

在这里插入图片描述
在启动类上开启缓存注解功能

@SpringBootApplication
@EnableTransactionManagement //开启注解方式的事务管理
@Slf4j
@EnableCaching //开启缓存注解功能
public class SkyApplication {
    public static void main(String[] args) {
        SpringApplication.run(SkyApplication.class, args);
        log.info("server started");
    }

@CachePut注解
  将方法的返回值放到缓缓存中,Spring Cache有自己的命名规则:
比如@CachePut(cacheNames=“userCache” , key=“abc”),则缓存中的Key就是userCache::abc
  另外,如果需要动态的进行拼接Key值可以使用Sring el表达式语言,从参数或返回值中获取内容;

//1.从参数中动态获取,key=后变的参数要与函数的形参一致;
@PostMapping
@CachePut(cacheNames="userCache" , key="#user.id")
public User save(@RequestBody User user){
	userSerivce.insert(user);
	return user;
}

//2.从返回值中动态获取,key=后边是固定的result
@PostMapping
@CachePut(cacheNames="userCache" , key="#result.id")
public User save(@RequestBody User user){
	userSerivce.insert(user);
	return user;
}

//3.从多个参数中动态获取,key=后边是#p0(表示第一个参数);#p1(表示第2个参数)
@PostMapping
@CachePut(cacheNames="userCache" , key="#p0.id")
public User save(@RequestBody User user,String dishName){
	userSerivce.insert(user);
	return user;
}

@Cacheable注解
用法大致宇@CachePut相同,效果不同,会先到redis中查询有无结果,如果有则不调用下边的方法,如果没有才调用,并随后将被调用的方法的返回值加入redis中;

@PostMapping
@Cacheable(cacheNames="userCache" , key="#user.id")
public User save(@RequestBody User user){
	userSerivce.insert(user);
	return user;
}

@CacheEvict注解
清理缓存数据

//该代码一次只清理一条数据,删除指定key的键值对;
@PostMapping
@CacheEvict(cacheNames="userCache" , key="#user.id")
public User save(@RequestBody User user){
	userSerivce.insert(user);
	return user;
}

//该代码一次能够清理所有的数据;
@PostMapping
@CacheEvict(cacheNames="userCache" , allEntries=true)
public User save(@RequestBody User user){
	userSerivce.insert(user);
	return user;
}
2.2 在项目中使用spring-cache

1.导入maven坐标;

<!--redis对应的坐标-->
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
 </dependency>
 
<!--Spring Cache对应的坐标-->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-cache</artifactId>
 </dependency>

2.在启动类上加上@EnableCaching

@SpringBootApplication
@EnableTransactionManagement //开启注解方式的事务管理
@Slf4j
@EnableCaching //开启缓存注解功能
public class SkyApplication {
    public static void main(String[] args) {
        SpringApplication.run(SkyApplication.class, args);
        log.info("server started");
    }
}

3.在用户端SetmealController的上list方法上加上@Cacheable注解

//当用户获取套餐列表时会将套餐内容设置到redis中
  @GetMapping("/list")
  @ApiOperation("根据分类id查询套餐")
  @Cacheable(cacheNames = "setmealCache",key = "#categoryId")  //key
  public Result<List<Setmeal>> list(Long categoryId) {
      Setmeal setmeal = new Setmeal();
      setmeal.setCategoryId(categoryId);
      setmeal.setStatus(StatusConstant.ENABLE);

      List<Setmeal> list = setmealService.list(setmeal);
      return Result.success(list);
  }

4.在管理端SetmealController的save,delete,update,startOrStop等方法上加上CacheEvict注解;

//新增时,删除指定套餐;
 @PostMapping
 @ApiOperation("新增套餐")
 @CacheEvict(cacheNames = "setmealCache",key = "#setmealDTO.categoryId")
 public Result save(@RequestBody SetmealDTO setmealDTO) {
     setmealService.saveWithDish(setmealDTO);
     return Result.success();
 }

//批量删除套餐时,删除缓存中所有的套餐数据;
@DeleteMapping
@ApiOperation("批量删除套餐")
@CacheEvict(cacheNames = "setmealCache",allEntries = true)
public Result delete(@RequestParam List<Long> ids){
    setmealService.deleteBatch(ids);
    return Result.success();
}

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

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

相关文章

fish终端下conda activate失败

【问题】fish终端下激活conda环境报错&#xff1a; >> conda activate base CondaError: Run conda init before conda activate ## 然而运行 conda init fish 仍旧无法解决【解决】 参考&#xff1a;https://github.com/conda/conda/issues/11079 方法一&#xf…

云手机受欢迎背后的原因及未来展望

随着办公模式的演变&#xff0c;云手机的热潮迅速兴起。在各种办公领域&#xff0c;云手机正展现出卓越的实际应用效果。近年来&#xff0c;跨境电商行业迎来了蓬勃发展&#xff0c;其与国内电商的差异不仅体现在整体环境上&#xff0c;更在具体的操作层面呈现出独特之处。海外…

2024年顶级游戏公司的薪酬大揭秘!

游戏业已经成为娱乐产业的重要组成部分&#xff0c;随着越来越多精美绝伦的游戏问世&#xff0c;为我们带来无数欢乐。它不仅深深融入了我们的生活&#xff0c;也促进了游戏开发作为职业的热门程度&#xff0c;吸引了无数有才华和梦想的年轻人加入这一行业。 在这样一个充满机…

【问题】pycharm无法添加conda环境,没有反应!

① 问题描述 pycharm版本:pycharm-community-2023.3.3 在conda中已经创建了虚拟环境Python38,想要在pycharm中设置添加Python编译器,想使用conda的环境。但是,怎么都没有反应。 ② 解决方法 可以选择系统解释器,然后选中conda虚拟环境envs中的Python.exe作为系统解释器…

Python四级考试笔记

Python四级考试笔记【源源老师】 四级标准 一、 理解函数及过程、函数的参数、函数的返回值、变量作用域等概念。 二、 能够创建简单的自定义函数。 三、 理解算法以及算法性能、效率的概念&#xff0c;初步认识算法优化 效率的方法。 四、 理解基本算法中递归的概念。 五、 掌…

5G——小区搜索流程

小区搜索流程 小区搜索目标&#xff1a;读取到SIB1. 小区搜索流程概述&#xff1a;SIB1在PDSCH信道承载&#xff0c;承载SIB1的信道在哪个位置由PDCCH告诉&#xff0c;而PDCCH的基本信息由MIB告诉&#xff0c;MIB信息由广播信道PBCH广播出去&#xff0c;物理信道解调需要解调…

使用 apt 源安装 ROCm 6.0.x 在Ubuntu 22.04.01

从源码编译 rocSolver 本人只操作过单个rocm版本的情景&#xff0c;20240218 ubuntu 22.04.01 1&#xff0c;卸载原先的rocm https://docs.amd.com/en/docs-5.1.3/deploy/linux/os-native/uninstall.html # Uninstall single-version ROCm packages sudo apt autoremove ro…

掌上新闻随心播控,HarmonyOS SDK助力新浪新闻打造精致易用的资讯服务新体验

原生智能是HarmonyOS NEXT的核心亮点之一&#xff0c;依托HarmonyOS SDK丰富全面的开放能力&#xff0c;开发者只需通过几行代码&#xff0c;即可快速实现AI功能。新浪新闻作为鸿蒙原生应用开发的先行者之一&#xff0c;从有声资讯入手&#xff0c;将基于Speech Kit朗读控件上线…

几种SLAM算法跑出的效果比较

以下所有的SLAM算法均使用此辆ROS小车跑。 文章目录 1.Gmapping SLAM算法构建地图2.Hector SLAM算法构建地图3.Karto SLAM算法构建地图4.Cartographer SLAM算法构建地图5.深度摄像头的建图6.rtab-map(深度双目与激光雷达构建三维建图)7.ORB-SLAM8.无奖竞猜 1.Gmapping SLAM算法…

企业计算机服务器中了eking勒索病毒怎么办?Eking勒索病毒解密数据恢复

企业的生产运营离不开数据支撑&#xff0c;通过数据整合可以制定合理的解决发展方向&#xff0c;对于企业来说&#xff0c;保护数据安全是一项至关重要的工作。但网络安全威胁无处不在&#xff0c;给企业的生产运营带来了极大困扰。近日&#xff0c;云天数据恢复中心接到许多企…

基于stm32单片机智能洗衣机系统设计

目前洗衣机已成为人们日常清洁衣物的主要手段&#xff0c;过去的洗衣机多采用机械式洗涤的模式&#xff0c;存在着控制方式单一&#xff0c;无法控制水量的多少和未实现自动进水等问题。随着物联网和传感器在多个行业更为广泛的应用和技术上的发展&#xff0c;为洗衣机实现智能…

基于Java+SpringBoot+vue+elementui 实现即时通讯管理系统

目录 系统简介效果图源码结构试用地址源码下载地址技术交流 博主介绍&#xff1a; 计算机科班人&#xff0c;全栈工程师&#xff0c;掌握C、C#、Java、Python、Android等主流编程语言&#xff0c;同时也熟练掌握mysql、oracle、sqlserver等主流数据库&#xff0c;能够为大家提供…

第三十五回 梁山泊吴用举戴宗 揭阳岭宋江逢李俊-python中用Shell通配符匹配字符串

宋江被抓住&#xff0c;判脊杖二十&#xff0c;刺配江州牢城。临走时宋太公专门叮嘱他不要入伙梁山。 宋江和差人专门挑小路走&#xff0c;想避开梁山&#xff0c;结果还是被赤发鬼刘唐守到了。大家把宋江请上山&#xff0c;都参拜了宋江。看宋江执意要走&#xff0c;吴用说自…

护眼台灯该怎么选?2024年五大爆款品牌大盘点

护眼台灯是孩子学习过程中的得力助手&#xff0c;除了能提高学习效率外还能保护眼睛。但一些劣质的护眼灯可能存在各种问题&#xff0c;列如安全耐用性差、耐腐蚀耐磨性差、无法起到保护眼睛作用、光照刺眼不适等问题&#xff0c;这让很多家长在购入护眼灯时犯了难&#xff0c;…

林浩然与杨凌芸的Java集合奇遇记

林浩然与杨凌芸的Java集合奇遇记 The Java Collection Chronicles of Lin Haoran and Yang Lingyun 在一个充满代码香气的午后&#xff0c;程序员男主角林浩然正在他的编程世界里挥舞着键盘剑&#xff0c;探索Java王国中的神秘宝藏——集合。而我们的女主角杨凌芸&#xff0c;作…

测试文章笔记-SQL3种优化方法

SQL语句优化&#xff1a; 本质&#xff1a;降低执行时间 **核心思路&#xff1a;**找到执行计划中开销较高的操作&#xff0c;改写SQL语句或改变表访问方式调整执行计划。 举例&#xff1a; 1.使用索引替代全表扫描&#xff08;索引&#xff1a;是帮助MysQL高效获取数据的数…

自定义Linux登录自动提示语

设置提示语的方式 在Linux系统中&#xff0c;可以通过修改几个特定的文件来实现在用户登录时自动弹出提示语。以下是几个常用的方法&#xff1a; 1. 修改/etc/issue文件&#xff1a; 这个文件用于显示本地登录前的提示信息 sudo vi /etc/issue在项目合作的时候&#xff0c;…

哈希表——位图

哈希表——位图 基本概念一道面试题位图实现设置存在或不存在检查存在 解决一开始的问题 之前我们已经了解了哈希表的底层实现&#xff0c;今天我们来了解一下哈希表思想的衍生产物——位图。 基本概念 在了解位图之前&#xff0c;我们先来了解一些简单的概念。 我们都知道&a…

电视盒子什么牌子好?老烧实测2024电视盒子排行榜

电视盒子价格不贵&#xff0c;但功能丰富&#xff0c;看点播、直播&#xff0c;玩游戏&#xff0c;上网课等都不在话下&#xff0c;对大部分家庭来说电视盒子是必备的。不过面对众多产品的时候我们都不知道电视盒子什么牌子好&#xff0c;我是多年电视盒子老用户了&#xff0c;…

比较可相交4点结构迭代次数的顺序

( A, B )---6*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有6个节点&#xff0c;AB训练集各由6张二值化的图片组成&#xff0c;让差值结构有4个点&#xff0c;收敛误差7e-4&#xff0c;收敛199次&#xff0c;统计迭代次数平均值并排序。 如果行和列可以自由的变换&#xff0c;4个…