苍穹外卖-day07 - 缓存菜品- 缓存套餐- 添加购物车- 查看购物车- 清空购物车

本文介绍了如何利用Redis缓存菜品数据,通过SpringCache减少数据库查询,同时处理套餐相关操作,如查询、添加和清空购物车。重点展示了关键代码片段和缓存清理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 缓存菜品

用redis来缓存菜品数据 , 减少数据库查询操作 ;

缓存逻辑 : 

  • 每个分类下的菜品保存一份缓存数据

  • 数据库中菜品数据有变更时清理缓存数据

 关键代码 : 

	@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){
<think>好的,我现在需要解决用户提到的苍穹外卖系统中启用或禁用员工账号失败的问题。根据用户提供的引用内容,我需要先理解相关的代码和数据库结构,然后分析可能的问题原因。 首先,用户引用了EmployeeController中的startOrStop方法,这个方法处理启用和禁用账号的请求。代码路径是POST "/status/{status}",接收状态和员工ID。这里需要确认是否正确接收参数,是否有日志输出。根据代码中的日志记录,如果日志没有正确打印参数,可能参数绑定有问题,比如路径变量status是否正确映射,或者id是否通过请求参数传递。 接着,查看用户表设计,特别是status字段是int类型,允许1和0。如果数据库中的status字段类型不符,或者字段名有误,可能导致更新失败。例如,字段名是否确实是status,是否存在拼写错误。 然后,引用了updateEmp方法,这是一个PUT请求,用于更新员工信息。虽然startOrStop可能调用了不同的服务方法,但需要确认employeeService.startOrStop的实现是否正确,比如是否执行了正确的SQL更新语句,是否处理了异常情况,比如员工ID不存在。 可能的错误点包括:参数绑定不正确,如路径变量与方法参数名称不匹配;SQL语句错误,如字段名或表名错误;事务管理问题导致更新未提交;权限问题,如数据库用户没有更新权限;或者前端传递的参数格式不正确,比如id是否为Long类型。 需要逐步排查:首先检查日志输出,确认参数是否正确传递;然后检查SQL语句是否正确,是否有语法错误;接着验证数据库连接和权限;最后确认前端请求是否符合预期,比如是否传递了正确的id和status值。</think>### 逐步排查与解决方案 #### 1. **检查请求参数绑定** - **问题现象**:日志未输出正确参数值,或返回参数错误提示 - **解决方法**: - 确认路径变量`{status}`与`@PathVariable`参数名一致 - 检查前端是否通过`URL参数`或`请求体`传递`id`(根据代码应为URL参数) - 添加参数校验逻辑: ```java if(id == null || id <= 0){ return Result.error("非法ID"); } ``` #### 2. **验证SQL执行情况** - **问题现象**:日志显示执行SQL但数据库未更新 - **解决方法**: - 检查`employeeService.startOrStop`中SQL语句: ```sql UPDATE employee SET status = #{status} WHERE id = #{id} ``` - 确认数据库字段名是否为`status`(注意大小写敏感问题) - 添加SQL执行结果日志: ```java int affectedRows = employeeMapper.updateStatus(status, id); log.info("更新影响行数:{}", affectedRows); ``` #### 3. **事务与异常处理** - **问题现象**:控制台报错但无业务提示 - **解决方法**: - 添加事务注解保证原子性: ```java @Transactional public void startOrStop(Integer status, Long id) { //... } ``` - 捕获并处理异常: ```java try { employeeMapper.updateStatus(status, id); } catch (DataAccessException e) { log.error("数据库操作异常", e); throw new BusinessException("账号状态更新失败"); } ``` #### 4. **数据一致性验证** - **问题现象**:状态值不符合预期(如出现2、3等非法值) - **解决方法**: ```java if(status != 0 && status != 1){ throw new IllegalArgumentException("非法状态码"); } ``` #### 5. **前端联调验证** - **典型错误场景**: - 请求路径错误:未使用`/employee/status/1?id=1001`格式 - 请求方式错误:误用GET代替POST - 参数格式错误:传递字符串类型的id值 ### 补充验证步骤 1. **查看MyBatis日志**: 在`application.yml`中开启SQL日志: ```yaml logging.level.com.xxx.mapper: debug ``` 2. **数据库锁排查**: 检查是否出现行锁: ```sql SHOW OPEN TABLES WHERE In_use > 0; ``` ### 典型错误案例 **案例1**:前端传递`id=“1001”`(字符串类型) - **现象**:控制台报`NumberFormatException` - **修复**:前端改为传递数字类型 **案例2**:字段误写为`stats` - **现象**:SQL执行成功但数据未更新 - **修复**:修正字段名为`status` ### 最终代码优化建议 ```java @PostMapping("/status/{status}") @ApiOperation("启用禁用员工账号") public Result startOrStop( @PathVariable @Range(min = 0, max = 1, message = "状态值非法") Integer status, @RequestParam @Min(1) Long id) { if (employeeService.checkAdmin(id)) { return Result.error("管理员账号不可禁用"); } return Result.success(employeeService.updateStatus(status, id)); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值