苍穹外卖 将菜品缓存到Redis

CategoryController,用户端查询分类id及其分类下对应的菜品,假如是第一次查询,那么就从数据库中查询并加入redis缓存中,若不是第一次查询,那么直接从redis中查询,不再查询数据库。

java 复制代码
// redis缓存菜品,减少数据库的查询
// 在数据库中查找属于IO,假如有很多用户同时访问,那么查找效率将会变低,所以说要将菜品数据缓存在redis中,这样才方便调用
// 构造redis的逻辑:key就是分类的id,value是当前id下对应的菜品
@RestController("userDishController")
@RequestMapping("/user/dish")
@Slf4j
@Api(tags = "客户端-菜品浏览接口")
public class DIshController {
    @Autowired
    private DishService dishService;
    // 自动注入redis操作工具
    @Autowired
    private RedisTemplate redisTemplate;


    /**
     * 根据菜品分类id查询对于的菜品及其口味
     *
     * @param categoryId
     * @return
     */
    @GetMapping("/list")
    @ApiOperation("根据菜品分类查询对应菜品")
    public Result<List<DishVO>> list(Long categoryId) {
        // 构造redis中使用的key,规则:dish_分类id代表不同的菜品分类
        String key = "dish_" + categoryId;
        // 查询redis中是否查找当前key对应的菜品数据,将菜品数据封装为list集合返回
        List<DishVO> valueList = (List<DishVO>) redisTemplate.opsForValue().get(key);
        if (valueList != null && !valueList.isEmpty()) {
            // 若存在这个值,那么直接返回,无需查询数据库
            return Result.success(valueList);
        }
        // 若redis中不存在,那么查询数据库,并将其缓存在redis中
        Dish dish = new Dish();
        dish.setCategoryId(categoryId);
        // 查询在售状态中的菜品
        dish.setStatus(StatusConstant.ENABLE);
        List<DishVO> list = dishService.listWithFlavor(dish);
        // 将其缓存在redis中
        redisTemplate.opsForValue().set(key, list);
        return Result.success(list);
    }
    // 为了保持数据库中的数据和redis中缓存的数据保持一致,修改管理端的DishController的相关方法,每当数据发生变化,在管理端就要清除其缓存

}
相关推荐
MY_TEUCK7 小时前
【Java 后端】SpringBoot 登录认证与会话跟踪实战(JWT + Filter/Interceptor)
java·开发语言·spring boot
今天长肉了吗7 小时前
银行风控项目踩坑实录:指标跑了6小时,风险评分全挂了
java
计算机程序定制辅导7 小时前
计算机小程序毕设实战-基于Spring Boot与微信小程序的考研资源共享平台设计与实现基于springboot+微信小程序的考研复习辅助平台【完整源码+LW+部署说明+演示视频,全bao一条龙等】
spring boot·微信小程序·小程序·课程设计
随读手机7 小时前
多式联运信息交互平台完整方案(2026版)
java·ai·eclipse·云计算·区块链
许彰午8 小时前
03-二叉树——从递归遍历到非递归实现
java·算法
nj01288 小时前
Spring 循环依赖详解:三级缓存、早期引用、AOP 代理与懒加载
java·spring·缓存
野生技术架构师8 小时前
2026年最全Java面试题及答案汇总(建议收藏,面试前看这篇就够了)
java·开发语言·面试
程序员飞哥8 小时前
重构 AI 思维(一):Prompt Engineering,如何下达不可违抗的指令?
人工智能·后端
一只叫煤球的猫9 小时前
ThreadForge 源码解读一:ThreadScope 如何把并发任务放进清晰边界?
java·面试·开源
皮皮林5519 小时前
@Autowired 和 @Resource 注解有啥区别?你这项目怎么还混着用呢?
后端