缓存数据减轻服务器压力

20 篇文章 0 订阅

问题:不是所有的数据都需要请求后端的

  • 不是所有的数据都需要请求后端的,有些数据是重复的、可以复用的

在这里插入图片描述

解决方案:缓存

在这里插入图片描述

实现思路:每一个分类为一个key,一个可以下面可以有很多菜品

  • 前端是按照分类查询的,所以我们需要通过分类来缓存

在这里插入图片描述

缓存代码

    /**
     * 根据分类id查询菜品
     *
     * @param categoryId
     * @return
     */
    @GetMapping("/list")
    @ApiOperation("根据分类id查询菜品")
    public Result<List<DishVO>> list(Long categoryId) {

        // 查询redis缓存
        String key = "dish_" + categoryId;
        // 如果缓存中有数据,直接返回
        List<DishVO> list= (List<DishVO>) redisTemplate.opsForValue().get(key);
        if(ObjectUtil.isNotEmpty(list)){
            return Result.success(list);
        }
        // 如果缓存中没有数据,查询数据库,然后将数据存入缓存
        Dish dish = new Dish();
        dish.setCategoryId(categoryId);
        dish.setStatus(StatusConstant.ENABLE);//查询起售中的菜品

        list = dishService.listWithFlavor(dish);
        redisTemplate.opsForValue().set(key, list);

        return Result.success(list);
    }

清除缓存

当数据发生变化的时候,需要将历史缓存清除掉,防止不一致

在这里插入图片描述

package com.sky.controller.admin;

import java.util.List;
import java.util.Set;

@RestController
@RequestMapping("/admin/dish")
@Api(tags = "菜品相关接口")
@Slf4j
public class DishController {

    private DishService dishService;
    private RedisTemplate redisTemplate;

    @Autowired
    public DishController(DishService dishService, RedisTemplate redisTemplate) {
        this.dishService = dishService;
        this.redisTemplate = redisTemplate;
    }

    /**
     * 新增菜品
     */
    @PostMapping
    @ApiOperation("新增菜品")
    public Result<String> save(@RequestBody DishDTO dishDTO){
        log.info("新增菜品:{}", dishDTO);
        dishService.saveWithFlavor(dishDTO);

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



    /**
     * 删除菜品
     */
    @DeleteMapping
    @ApiOperation("删除菜品")
    public Result<String> delete(@RequestParam List<Long> ids){
        log.info("删除菜品:{}", ids);
        dishService.deleteBatch(ids);

        // 清理所有的缓存
        cleanCache("dish_*");
        return Result.success();
    }


    /**
     * 更新菜品
     * @param dishDTO 菜品信息
     */
    @PutMapping
    @ApiOperation("更新菜品")
    public Result  update(@RequestBody DishDTO dishDTO) {
        log.info("更新菜品:{}", dishDTO);
        dishService.updateWithFlavor(dishDTO);

        // 清理缓存
        cleanCache("dish_*");
        return Result.success();
    }

    @PostMapping("/status/{status}")
    @ApiOperation("更新菜品状态")
    public Result startOrStop( @PathVariable Integer status,Long id){
        log.info("更新菜品状态:{}", id);
        dishService.startOrStop(status,id);
        // 清理缓存
        cleanCache("dish_*");
        return Result.success();
    }


    /**
     * 清理缓存
     */
    private void cleanCache(String pattern){
        Set<String> keys = redisTemplate.keys(pattern);
        redisTemplate.delete(keys);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值