苍穹外卖--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);
    }

添加购物车

需求分析

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

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

相关推荐
火山上的企鹅6 小时前
Codex实战:APP远程升级服务搭建(三)后台管理页面(APK 上传、版本管理、多应用页签)
服务器·网络·数据库·oracle·qgc
阿狸猿6 小时前
论 NoSQL 数据库技术及其应用
数据库·nosql
FBI HackerHarry浩7 小时前
DataGrip2023.2.3默认保存的数据库和.sql文件在哪里?怎么修改默认路径?
数据库
袁小皮皮不皮7 小时前
3.HCIP OSPF补充知识(优化版)
服务器·网络·数据库·网络协议·智能路由器
运筹vivo@7 小时前
Python ContextVar 底层机制与内存模型拆解
前端·数据库·python
志栋智能7 小时前
超自动化巡检:知识沉淀与团队协作的新载体
大数据·运维·网络·数据库·人工智能·自动化
syt_biancheng8 小时前
Redis初识
数据库·redis·缓存
cmes_love8 小时前
股票逐笔level2历史行情下载十档订单薄五档tick分钟下载分享
数据库·区块链
仙俊红8 小时前
SQL 调优需要掌握的知识
数据库·sql
fofantasy9 小时前
NSK LH12AN 微型导轨技术手册
运维·网络·数据库·经验分享·规格说明书