苍穹外卖 将菜品缓存到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的相关方法,每当数据发生变化,在管理端就要清除其缓存

}
相关推荐
长栎34 分钟前
写 for 循环写了十年,你却从没用过迭代器模式最狠的那一面
后端
LiaCode38 分钟前
Redis 在生产项目的使用
前端·后端
用户5598224812242 分钟前
Docker Compose Down 导致容器数据误删——ext4 日志恢复全记录
后端
LiaCode43 分钟前
一天学完 redis 的爽翻版核心知识总结
前端·后端
大刚测试开发实战44 分钟前
如何内网穿透访问本地私有化部署的TestHub
前端·后端·github
xiaodaoluanzha1 小时前
迄今為止,最簡單的編程語言 Nolang
前端·后端
Csvn1 小时前
Docker 容器管理入门 — 从镜像到容器编排
后端
用户762352425911 小时前
ShardingJDBC
后端
行者全栈架构师1 小时前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_01 小时前
mac(m5)平台编译openjdk
java