苍穹外卖--04--Redis 缓存菜品信息、购物车

Redis 缓存菜品信息

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

通过 Redis 来缓存菜品数据,减少数据库查询操作。

缓存逻辑分析:

  • 每个分类下的菜品保存一份缓存数据
  • 数据库中菜品数据有变更时清理缓存数据

具体编码

修改用户端接口 DishController 的 list 方法(该方法负责根据分类 id,查询该分类下的所有菜品),加入缓存处理逻辑:

java 复制代码
@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);
    }

为了保证数据库Redis 中的数据保持一致,修改管理端接口 DishController 的相关方法,加入清理缓存逻辑。

所有对增删改的方法都需要改造:

  • 新增菜品
  • 修改菜品
  • 批量删除菜品
  • 起售、停售菜品

在管理端 DishController 中修改代码:

新增菜品功能--增加删除缓存

java 复制代码
	/**
     * 新增菜品
     *
     * @param dishDTO
     * @return
     */
    @PostMapping
    @ApiOperation("新增菜品")
    public Result save(@RequestBody DishDTO dishDTO) {
        log.info("新增菜品:{}", dishDTO);
        dishService.saveWithFlavor(dishDTO);

        //清理缓存数据
        String key = "dish_" + dishDTO.getCategoryId();
        cleanCache(key);
        return Result.success();
    }

2). 菜品批量删除功能--增加删除缓存

java 复制代码
	/**
     * 菜品批量删除
     *
     * @param ids
     * @return
     */
    @DeleteMapping
    @ApiOperation("菜品批量删除")
    public Result delete(@RequestParam List<Long> ids) {
        log.info("菜品批量删除:{}", ids);
        dishService.deleteBatch(ids);

        //将所有的菜品缓存数据清理掉,所有以dish_开头的key
        cleanCache("dish_*");

        return Result.success();
    }

其它不一一列举

Spring Cache

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

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

  • EHCache
  • Caffeine
  • Redis(当前所用)

CachePut

java 复制代码
@PostMapping
@CachePut(value = "userCache", key = "#user.id")
public User save(@RequestBody User user){
    userMapper.insert(user);
    return user;
}

数据内容为:

java 复制代码
user.id = 1;
user.name = "Alice";

那么,Spring 层面认为的缓存:

java 复制代码
缓存名称(value)​​:userCache
这是逻辑上的缓存分区名称,Spring 会用它区分不同的缓存组。
​​缓存键(key)​​:1(由 #user.idSpEL 表达式计算得出)
​​缓存值(value)​​:User对象({id=1, name="Alice"})

到 Redis 里真正存的内容是:

java 复制代码
Redis Key: "userCache::1"
Redis Value: "{\"id\":1,\"name\":\"Alice\"}"  (序列化后的JSON)

缓存套餐

代码开发

实现步骤:

1). 导入 Spring Cache 和 Redis 相关 maven 坐标

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

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

4). 在管理端接口 SetmealController 的 save、delete、update、startOrStop 等方法上加入 CacheEvict 注解

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

java 复制代码
	/**
     * 条件查询
     *
     * @param categoryId
     * @return
     */
    @GetMapping("/list")
    @ApiOperation("根据分类 id 查询套餐")
    @Cacheable(cacheNames = "setmealCache",key = "#categoryId") //key: setmealCache::100
    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);
    }

添加购物车

需求分析

  • 用户可以将菜品或者套餐添加到购物车。
  • 对于菜品来说,如果设置了口味信息,则需要选择规格后才能加入购物车;
  • 对于套餐来说,可以直接点击将当前套餐加入购物车。

这个功能,简单来说,就是接收前端传来的信息,并存在表里即可,无需额外操作。

相关推荐
r i c k11 分钟前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦25 分钟前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL1 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·1 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德1 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫2 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i2 小时前
完全卸载MariaDB
数据库·mariadb
期待のcode2 小时前
Redis的主从复制与集群
运维·服务器·redis
纤纡.2 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn2 小时前
【Redis】渐进式遍历
数据库·redis·缓存