苍穹外卖-day07

YangeIT大约 23 分钟苍穹外卖Redis缓存购物车Caffeine

苍穹外卖-day07

课程内容

  • 缓存菜品
  • 缓存套餐
  • 添加购物车
  • 查看购物车
  • 清空购物车

知识储备

  1. 上一天的商品模块已经导入
  2. 微信登陆已经完成
  3. 理解Redis数据库的作用
  4. 曾经做过被人清空购物车的 美梦

功能实现🎯:缓存商品购物车

效果图:

image-20221208175444066 image-20221208175454987image-20221208175533325

1. 缓存菜品 🍐 ✏️ 🚩

1.1 问题说明和解决方案

问题说明和解决方案

⚠️ 系统响应慢、用户体验差

用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库 访问压力随之增大。

image-20221208180228667

代码开发 ✏️

修改用户端接口 DishController list 方法,加入缓存处理逻辑(点击查看流程图)sadaopen in new window 👈

@Autowired
private RedisTemplate redisTemplate;
/**
    * 根据分类id查询菜品
    *
    * @param categoryId
    * @return
    */
@GetMapping("/list")
@ApiOperation("根据分类id查询菜品")
public Result<List<DishVO>> list(Long categoryId) {

    //构造redis中的key,规则:dish_分类id
    String 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);//查询起售中的菜品

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

    return Result.success(list);
}
 
 











 


 












 



总结

课堂作业

  1. 为什么要使用Redis做缓存,怎么保障数据一致性🎤
  2. 使用Redis做缓存,一定能实现高并发吗?🎤

2. 缓存套餐 🍐 ✏️ 🚩

2.1 Spring Cache

Spring Cache

Spring Cachesada 是一个框架,实现了基于注解 的缓存功能,只需要简单地加一个注解,就能实现缓存功能简单易用

Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现,例如:

  • EHCache
  • Caffeine 👈
  • Redis(如果配置了Redis,则使用其缓存) 企业常用

2.1.3 入门案例

1). 环境准备

导入基础工程: 底层已使用Redis缓存实现

基础环境的代码,在我们今天的资料中已经准备好了, 大家只需要将这个工程导入进来就可以了。导入进来的工程结构如下:

image-20221210183942040

数据库准备:

创建名为spring_cache_demo数据库,将springcachedemo.sql(如下:👇)脚本直接导入数据库中。

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  `age` int DEFAULT NULL,
  PRIMARY KEY (`id`)
);

image-20221210184346304

引导类上加@EnableCaching:

package com.itheima;

@Slf4j
@SpringBootApplication
@EnableCaching//开启缓存注解功能
public class CacheDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(CacheDemoApplication.class,args);
        log.info("项目启动成功...");
    }
}




 






总结

  1. SpringCache中提供了很多缓存操作的注解,常见的@Cacheable@CachePut@CacheEvict

课堂作业

  1. @Cacheable注解有什么作用?一般用在什么操作的方法上?🎤
  2. #result.id#user.id的含义是什么?
  3. 导入资料中的案例,运行测试一下,体会下3个注解的作用

2.2 套餐缓存 🍐

使用注解实现套餐缓存

使用注解实现套餐缓存 🎯

实现步骤

  1. 导入Spring Cache和Redis相关maven坐标
  2. 在启动类上加入@EnableCaching注解,开启缓存注解功能
  3. 在用户端接口SetmealControllerlist 方法上加入@Cacheable注解
  4. 在管理端接口SetmealController的 save、delete、update、startOrStop等方法上加入CacheEvict注解

2.3 代码开发 ✏️ ❤️

1). 导入Spring Cache和Redis相关maven坐标(已实现)

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

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

2). 在启动类上加入@EnableCaching注解,开启缓存注解功能

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




 






总结

课堂作业

  1. 怎么保障Redis和Mysql数据的一致性?🎤

3. 添加购物车 🍐 ❤️ 🚩

添加购物车分析和代码

产品原型

用户可以将菜品或者套餐添加到购物车

  1. 对于菜品来说,如果设置了口味信息,则需要选择规格后才能加入购物车;
  2. 对于套餐来说,可以直接点击image-20210813181916235将当前套餐加入购物车。
  3. 在购物车中可以修改菜品和套餐的数量,也可以清空购物车。

效果图:

image-20221210203822817

代码开发步鄹

  1. 根据添加购物车接口的参数设计DTO
  2. 根据添加购物车接口创建ShoppingCartController
  3. 创建ShoppingCartService接口
  4. 创建ShoppingCartServiceImpl实现类,并实现add方法
  5. 创建ShoppingCartMapper接口

DTO设计

根据添加购物车接口的参数设计DTO:

image-20221208184938195

在sky-pojo模块,ShoppingCartDTO.java已定义

package com.sky.dto;

@Data
public class ShoppingCartDTO implements Serializable {

    private Long dishId;
    private Long setmealId;
    private String dishFlavor;

}

课堂作业

🎻 1. 根据交互流程图绘制自己的流程,理解思路

  1. 参考流图编写代码!

4. 查看购物车 ✏️

查看购物车需求分析和编码

产品原型

当用户添加完菜品和套餐后,可进入到购物车中,查看购物中的菜品和套餐。

image-20221208190038058

代码开发步鄹

  1. 在ShoppingCartController中创建查看购物车的方法
  2. 在ShoppingCartService接口中声明查看购物车的方法
  3. 在ShoppingCartServiceImpl中实现查看购物车的方法

4.2.1 Controller层

在ShoppingCartController中创建查看购物车的方法:

/**
    * 查看购物车
    * @return
    */
@GetMapping("/list")
@ApiOperation("查看购物车")
public Result<List<ShoppingCart>> list(){

    return Result.success(shoppingCartService.showShoppingCart());

}

总结

课堂作业

  1. 获取购物车的数据需要什么参数?🎤
  2. 阅读接口文档,独自完成查看购物车代码?

5. 清空购物车 ✏️

清空购物车需求分析和代码

产品原型

当点击清空按钮 时,会把购物车中的数据全部清空

image-20221210213703715

开发步鄹

  1. 在ShoppingCartController中创建清空购物车的方法
  2. 在ShoppingCartService接口中声明清空购物车的方法
  3. 在ShoppingCartServiceImpl中实现清空购物车的方法
  4. 在ShoppingCartMapper接口中创建删除购物车数据的方法

5.2.1 Controller层

在ShoppingCartController中创建清空购物车的方法:

/**
    * 清空购物车商品
    * @return
    */
@DeleteMapping("/clean")
@ApiOperation("清空购物车商品")
public Result<String> clean(){
    shoppingCartService.cleanShoppingCart();
    return Result.success();
}

课后作业

🚩 1. 重点完成上述的课堂作业

  1. 晚自习第一节课的前30分钟,总结完毕之后,每个同学先必须梳理今日知识点 (记得写不知道的,以及感恩三件事);整理好的笔记可以发给组长,组长交给班长,意在培养大家总结的能力)

  2. 晚自习第一节课的后30分钟开始练习(记住:程序员是代码堆起来的):

  3. 剩余的时间:预习第二天的知识,预习的时候一定要注意:

  • 预习不是学习,不要死看第二天的视频(很容易出现看了白看,为了看视频而看视频)
  • 预习看第二天的笔记,把笔记中标注重要的知识,可以找到预习视频,先看一遍,如果不懂的 ,记住做好标注。