项目优化Day1-14-缓存套餐数据-实现思路&代码改造

项目优化Day1-14-缓存套餐数据-实现思路&代码改造

1.缓存套餐数据:

1.实现思路

​ 前面我们已经实现了移动端套餐查看功能,对应的服务端方法为SetmealController的list方法,此方法会根据前端提交的查询条件进行数据库查询操作。在高并发的情况下,频繁查询数据库会导致系统性能下降,服务端响应时间增长。现在需要对此方法进行缓存优化,提高系统的性能。

​ 具体的实现思路如下:

​ 1.导入SpringCache和Redis相关Maven坐标

​ 2.在application.yml中配置缓存数据的过期时间

​ 3.在启动类上加入@EnableCaching注解,开启缓存注解功能

​ 4.在SetmealController的list方法上加入@Cacheable注解

​ 5.在SetmealController的save和delete方法上加入@CacheEvict注解

​ 当我们新增套餐或者是删除套餐之后,我们需要同步的去清理对应的缓存数据,通过这个CacheEvict注解就可以清理

2.代码改造

    @GetMapping("/list")
    @Cacheable(value = "setmealCache", key = "#selmeal.categoryId + '_' + #setmeal.status")
    public R<List<Setmeal>> list(Setmeal setmeal){
        LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(setmeal.getStatus() != null, Setmeal::getStatus, setmeal.getStatus());
        queryWrapper.eq(setmeal.getCategoryId() != null, Setmeal::getCategoryId, setmeal.getCategoryId());
        queryWrapper.orderByDesc(Setmeal::getUpdateTime);

        List<Setmeal> list = setmealService.list(queryWrapper);

        return R.success(list);
    }

测试发现报错,但是查询菜品数据就没问题

java.lang.IllegalArgumentException: 
DefaultSerializer requires a Serializable payload but received an object of type [com.itheima.reggie.common.R]

​ 这是因为套餐这里加入了@Cacheable注解,而这个方法的返回值是R这种对象,而R这种对象是不能序列化的。所以我们现在的问题就是,就是我们这个R这个类,需要让他实现序列化接口,要不然是无法缓存的。咱们前面在做SpringCache案例的时候,咱们返回的是user对象,而我们当时那个user对象其实是实现了序列化接口,所以没有报这个错,而我们现在的返回结果变成了R对象,所以我们需要让R这个类实现序列化接口。

​ 为什么前面存菜品数据的时候没有报错呢??

​ 因为前面返回的是dish对象,已经实现序列化接口了。

至于最开始直接用Redis存的是基本数据类型,Java已经序列化了。

    /*新增套餐*/
    @PostMapping
    //表示我要清理setmealCache这个分类下面所有的缓存数据,需要加入allEntries = true这个属性,如果不加的话,默认值是false
    @CacheEvict(value = "setmealCache", allEntries = true)
    public R<String> save(@RequestBody SetmealDto setmealDto) {
        log.info("套餐信息为:{}", setmealDto.toString());
        setmealService.saveWithDish(setmealDto);
        return R.success("套餐添加成功");
    }


    /*删除套餐*/
    @DeleteMapping
    //表示我要清理setmealCache这个分类下面所有的缓存数据,需要加入allEntries = true这个属性,如果不加的话,默认值是false
    @CacheEvict(value = "setmealCache", allEntries = true)
    public R<String> delete(@RequestParam List<Long> ids){
        log.info(ids.toString());
        setmealService.removeWithDish(ids);
        return R.success("套餐数据删除成功");
    }

3.功能测试

​ 测试无问题,嘿嘿

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值