当前位置: 首页 > article >正文

缓存数据减轻服务器压力

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

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

在这里插入图片描述

解决方案:缓存

在这里插入图片描述

实现思路:每一个分类为一个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);
    }

}


http://www.kler.cn/news/335676.html

相关文章:

  • Hive数仓操作(二)
  • Go语言实现长连接并发框架 - 请求分发器
  • Rust-模式匹配
  • 2024年9月30日--10月6日(ue5肉鸽结束)
  • 猫猫cpu的缓存(NW)
  • 单片机长短按简单实现
  • 全网最适合入门的面向对象编程教程:56 Python字符串与序列化-正则表达式和re模块应用
  • Nginx基础详解5(nginx集群、四七层的负载均衡、Jmeter工具的使用、实验验证集群的性能与单节点的性能)
  • 解决Ubuntu无法找到python3.7的包的问题 E: Couldn‘t find any package by glob ‘python3.7‘
  • 华为仓颉语言入门(9):for-in表达式
  • Pikichu-xss实验案例-通过xss获取cookie
  • 基于Python的人工智能应用案例系列(15):LSTM酒类销售预测
  • CMake构建工程基本要素
  • 文本到语音或视频的构想
  • 什么是数字化智能工厂的组成
  • Microsoft Edge 离线安装包制作或获取方法和下载地址分享
  • 从DBA是“擦车的”谈起
  • 【Linux】用虚拟机配置Ubuntu 24.04.1 LTS环境
  • 社群团购中的用户黏性价值:以开源小程序多商户AI智能名片商城源码为例
  • 科技赋能,商贸物流新速度 —— 智慧供应链商城加速企业成长