Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单的加一个注解,就能实现缓存功能。
提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口统一不同的缓存技术。
CacheManager是Spring提供的各种缓存技术抽象接口。
针对不同的缓存技术需要实现不同的CacheManager:
@CacheConfig 类级别的缓存注解,允许共享缓存名称
@Caching 将多种缓存操作分组
@Cacheable 触发缓存入口
@CacahePut 更新缓存
@CacheEvict 触发移除缓存
最常用的为最后三个:@Cacheable、@CacheEvict、@CacheEvict
在springboot项目中,使用缓存技术只需要在项目中导入相关缓存技术的依赖包,并在启动类上使用@EnableCaching开启缓存支持即可。
例如,使用redis作为缓存技术,只需要导入spring data redis 的maven坐标即可。
缓存套餐数据
前面我们已经实现了移动端套餐查看功能,对应的服务端方法为SetmealController的list方法,此方法会根据前端提交的查询条件进行数据库查询操作。在高并发的情况下,频繁查询数据库会导致系统性能下降,服务端响应时间增长。现在需要对此方法进行缓存优化,提高系统的性能。
具体的实现思路如下:
org.springframework.boot spring-boot-starter-data-redis org.springframework.boot spring-boot-starter-cache
cache:redis:time-to-live: 1800000 #设置缓存数据的过期时间 30分钟
/*** @author tigerhhzz* @date 2023/3/11 19:37*/
@Slf4j
@SpringBootApplication
@ServletComponentScan
@EnableTransactionManagement(proxyTargetClass = true)
@EnableCaching //开启缓存注解功能
public class tigerhhzzwaimaiappliction {public static void main(String[] args) {SpringApplication.run(tigerhhzzwaimaiappliction.class,args);log.info("tiger的项目启动成功。");}
}
在setmealcontroller的list方法上加入@Cacheable注解
/***查询套餐列表* @param setmeal* @return*/@GetMapping("/list")@Cacheable(value = "setmealCache",key = "#setmeal.categoryId + '_' + #setmeal.status")public R> list(Setmeal setmeal) {log.info("setmeal:{}", setmeal);//条件构造器LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();queryWrapper.like(StringUtils.isNotEmpty(setmeal.getName()), Setmeal::getName, setmeal.getName());queryWrapper.eq(null != setmeal.getCategoryId(), Setmeal::getCategoryId, setmeal.getCategoryId());queryWrapper.eq(null != setmeal.getStatus(), Setmeal::getStatus, setmeal.getStatus());queryWrapper.orderByDesc(Setmeal::getUpdateTime);return R.success(setmealService.list(queryWrapper));}
在setmealcontroller的sava和delete方法上加入CacheEvict注解
/*** 新增套餐* @param setmealDto* @return*/@PostMapping@CacheEvict(value = "setmealCache",allEntries = true)public R save(@RequestBody SetmealDto setmealDto){log.info("套餐信息:{}",setmealDto);setmealService.saveWithDish(setmealDto);return R.success("新增套餐成功");}
/*** 删除套餐** @param ids* @return*/@DeleteMapping@CacheEvict(value = "setmealCache",allEntries = true)public R delete(@RequestParam List ids){log.info("ids:{}",ids);setmealService.removeWithDish(ids);return R.success("套餐数据删除成功");}