P24-项目优化-Spring Cache缓存套餐数据
1.实现思路
前面已经实现了移动端套餐查看功能,对应的服务端方法为SetmealController的list方法,此方法会根据前端提交的查询条件进行数据库查询操作。
在高并发的情况下,频繁查询数据库会导致系统性能下降,服务端响应时间增长。现在需要对此方法进行缓存优化,提高系统的性能。
具体的实现思路如下:
- 导入Spring Cache和Redis相关maven坐标
- 在application.yml中 配置缓存数据的过期时间
- 在启动类上加入@EnableCaching注解,开启缓存注解功能
- 在SetmealController的list方 法上加入@Cacheable注解
- 在SetmealController的save和delete方法上加入CacheEvict注解
2.代码改造
2.1导入Spring Cache和Redis相关maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2.2在application.yml中 配置缓存数据的过期时间
server:
port: 8080
spring:
application:
name: reggie_take_out
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ruiji?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: 123456
redis:
host: 192.168.112.100
port: 6379
password: 123456
database: 0
cache:
redis:
time-to-live: 18000 #设置缓存数据的过期时间
mybatis-plus:
configuration:
#在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
id-type: ASSIGN_ID
# 文件上传后保存路径
rj:
path: F:\JavaCode\RuiJiProject\src\main\java\com\jq\uploaddata\
2.3在启动类上加入@EnableCaching注解,开启缓存注解功能
@Slf4j
@ServletComponentScan
@SpringBootApplication
@EnableTransactionManagement
@EnableCaching //开启Spring Cache
public class RuiJiApplication {
public static void main(String[] args) {
log.info("正在启动服务...");
SpringApplication.run(RuiJiApplication.class,args);
}
}
2.4在SetmealController的list方法上加入@Cacheable注解
/**
* 根据条件查询套餐数据
* @param setmeal
* @return
*/
@GetMapping("/list")
@Cacheable(value = "setmealCache",key ="#setmeal.categoryId+'_'+#setmeal.status")
public R<List<Setmeal>>list(Setmeal setmeal){
LambdaQueryWrapper<Setmeal>queryWrapper=new LambdaQueryWrapper<>();
queryWrapper.eq(setmeal.getCategoryId()!=null,Setmeal::getCategoryId,setmeal.getCategoryId());
queryWrapper.eq(setmeal.getStatus()!=null,Setmeal::getStatus,setmeal.getStatus());
queryWrapper.orderByDesc(Setmeal::getUpdateTime);
List<Setmeal> list = setmealService.list();
return R.success(list);
}
2.5在SetmealController的save方法上加入CacheEvict注解
/**
* 新增套餐
* @param setmealDto
* @return
* 涉及两张表操作
*/
@PostMapping
@CacheEvict(value ="setmealCache",allEntries = true)
public R<String> save(@RequestBody SetmealDto setmealDto){
log.info("套餐信息:{}",setmealDto);
setmealService.saveWithDish(setmealDto);
return R.success("新增套餐成功");
}
2.6在SetmealController的delete方法上加入CacheEvict注解
/**
* 删除套餐
* @param ids
* @return
*/
@DeleteMapping
@CacheEvict(value ="setmealCache",allEntries = true)
public R<String>delete(@RequestParam List<Long> ids){
log.info("ids:{}",ids);
setmealService.removeWithDish(ids);
return R.success("套餐删除成功");
}