前言
将商品信息放进redis缓存 Spring Cache技术
系统查询性能 用户端访问量过大 数据库访问压力随之增大 系统响应慢
使用Redis 缓存菜品数据 减少数据库查询 基于内存保存数据
前端 发请求 查询 后端服务 查询缓存是否存在 (存在缓存 读取缓存 不存在缓存 查询数据库 查询到数据 载入缓存)
key-value 键值对匹配
缓存逻辑分析 根据分类缓存数据 每个分类下菜品保存一份缓存数据
key dish_id value string List对象序列化成字符串 存储
菜品数据变更时 清理缓存数据 (延迟双删)
每次切换查询数据 都会发请求 查询数据库
public class DishController {
@Autowired
private DishService dishService;
@Autowired
// 已创建RedisConfiguration 直接注入即可
private RedisTemplate redisTemplate;
/**
* 根据分类id查询菜品
*
* @param categoryId
* @return
*/
@GetMapping("/list")
@ApiOperation("根据分类id查询菜品")
public Result<List<DishVO>> list(Long categoryId) {
//查询Redis 中是否存在菜品数据 操作redis 注入对象
//构造redis的 key
String key = "dish_" + categoryId;
List<DishVO> list = (List<DishVO>) redisTemplate.opsForValue().get(key);
if(list != null && list.size() > 0){
// 如果存在 直接返回 不查询数据库
return Result.success(list);
}
//如果不存在 查询数据库 将查询到的数据存入Redis中
Dish dish = new Dish();
dish.setCategoryId(categoryId);
dish.setStatus(StatusConstant.ENABLE);//查询起售中的菜品
list = dishService.listWithFlavor(dish);
redisTemplate.opsForValue().set(key, list);
return Result.success(list);
}
}
清理缓存数据
保证数据一致性 缓存和数据库
修改 删除时 状态变化 新增时 清理缓存
改造对应方法 (DishController) 修改 admin 下 DishController 方法
清理缓存数据
package com.sky.controller.admin;
/**
* @author Admin
* @title: DishController
* @projectName minjiang-takeaway
* @description: DishController
* @date 2024/1/20 18:17
*/
import com.sky.dto.DishDTO;
import com.sky.dto.DishPageQueryDTO;
import com.sky.entity.Dish;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.DishService;
import com.sky.vo.DishVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Set;
/**
* 菜品管理
*/
@RestController
@RequestMapping("/admin/dish")
@Api(tags = "菜品管理相关接口")
@Slf4j
public class DishController {
@Autowired
private DishService dishService;
@Autowired
private RedisTemplate redisTemplate;
/**
* 新增菜品
*/
@PostMapping
@ApiOperation("新增菜品")
public Result save(@RequestBody DishDTO dishDTO){
log.info("新增菜品:{}",dishDTO.toString());
dishService.saveWithFlavor(dishDTO);
//清理缓存数据
String key = "dish_" + dishDTO.getCategoryId();
redisTemplate.delete(key);
return Result.success();
}
/**
* 菜品分页查询
*
* @param dishPageQueryDTO
* @return
*/
@GetMapping("/page")
@ApiOperation("菜品分页查询")
public Result<PageResult> page(DishPageQueryDTO dishPageQueryDTO) {
log.info("菜品分页查询:{}", dishPageQueryDTO);
//调用分页查询接口
PageResult pageResult = dishService.pag