缓存套餐数据
实现思路
前面实现了移动端套餐查看功能,对应的服务端方法为SetmealController的list方法,此方法会根据前端提供的查询条件进行数据库的查询操作。在高并发的情况下会影响系统性能,所以使用SpringCache和redis进行缓存优化,提高系统的性能。
- 导入相关坐标。
- 在配置文件中配置缓存数据的过期时间。
- 在启动类加入@EnableCaching注解,开启缓存注解功能。
- 在list方法上加上@Cacheable注解。
- 在save、delete方法上加上@CacheEvict注解。
代码实现
/**
* (移动端)套餐菜品展示。 根据条件查询套餐数据。
*
* @param setmeal
* @return
*/
@GetMapping("/list")
@Cacheable(value = "setmealCache", key = "#setmeal.categoryId+'_'+#setmeal.status")
public R<List<Setmeal>> list(Setmeal setmeal) {
log.info("套餐菜品展示{}", setmeal);
// select * from setmeal where categoryId = and status=;
LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(setmeal != null, Setmeal::getCategoryId, setmeal.getCategoryId());
queryWrapper.eq(setmeal != null, Setmeal::getStatus, setmeal.getStatus());
// 排序。
queryWrapper.orderByDesc(Setmeal::getUpdateTime);
List<Setmeal> setmealList = setmealService.list(queryWrapper);
return R.success(setmealList);
}
/**
* 新增套餐
*allEntries = true:当新增套餐时,清楚所有套餐缓存。
* @param setmealDto
* @return
*/
@PostMapping
@CacheEvict(value = "setmealCache",allEntries = true)
public R<String> save(@RequestBody SetmealDto setmealDto) {
log.info("新增套餐:{}", setmealDto);
// 先保存基本setmeal信息。
// setmealService.save(setmealDto);
// 保存套餐
setmealService.saveWithDish(setmealDto);
return R.success("新增套餐成功");
}
/**
* 根据id删除套餐信息。(删除一个或者批量删除) 需要删除关联表数据
*allEntries = true:当删除套餐时,删除所有套餐缓存。
* @param ids
* @return
*/
@DeleteMapping
@CacheEvict(value = "setmealCache",allEntries = true)
public R<String> delete(@RequestParam List<Long> ids) {
// 接收的id成功。
log.info("根据id删除套餐信息{}", ids);
// 根据id删除对应的套餐和关联表数据。
setmealService.removeWithDish(ids);
return R.success("删除套餐成功");
}
注意:R必须实现Serializable接口使可序列化,否则会报错。
启动类
/**
* @ClassName ReggieApplication @Description: boot启动类 @Author xiaojie @Date 2022/4/23 9:54 @Version
* 1.0 @ServletComponentScan扫描webfilter注解。
*/
@Slf4j
@SpringBootApplication
@ServletComponentScan
@EnableTransactionManagement
//开启注解方式缓存
@EnableCaching
public class ReggieApplication {
public static void main(String[] args) {
SpringApplication.run(ReggieApplication.class);
//打印日志
log.info("项目启动成功...");
}
}