当前位置: 首页 > news >正文

【黑马点评】jmeter测试秒杀接口前后耗时,和查询店铺(redis+caffeine二级缓存)接口

【黑马点评】jmeter测试秒杀接口前后耗时,和查询店铺缓存穿透接口

  • 4.测试秒杀接口耗时
    • 4.1 修改VoucherOrderController
    • 4.2 测试原本的接口耗时
  • 5. 测试缓存穿透

这篇是测试,使用RabbitMQ消息异步处理订单,以及不异步处理订单的耗时对比
以及查询店铺时使用redis+caffeine二级缓存接口

4.测试秒杀接口耗时

需要修改VoucherOrderController中的秒杀代码,在秒杀操作前后计算接口耗时

4.1 修改VoucherOrderController

注释掉原先的seckillVoucher方法

//    @PostMapping("seckill/{id}")
//    public Result seckillVoucher(@PathVariable("id") Long voucherId) {
//        return voucherOrderService.seckillVoucher(voucherId);
//    }

改为

    @PostMapping("seckill/{id}")public Result seckillVoucher(@PathVariable("id") Long voucherId) {long startTime = System.currentTimeMillis();Result  result = voucherOrderService.seckillVoucher(voucherId);long endTime = System.currentTimeMillis();long duration = endTime - startTime;log.info("秒杀接口耗时:{}ms",duration);
//        return voucherOrderService.seckillVoucher(voucherId);return result;}

之后,使用Apifox发起测试

在这里插入图片描述

命令行输出结构为:3ms

在这里插入图片描述

4.2 测试原本的接口耗时

修改VoucherOrderServiceImpl.java代码如下

主要注释掉如下三个方法

  • handleVoucherOrder
  • seckillVoucher
  • createVoucherOrder
    // @TODO 注释掉以下部分,以下部分为用RabbitMQ实现的异步秒杀
//    @Transactional
//    public void handleVoucherOrder(VoucherOrder voucherOrder) {
//        //1.所有信息从当前消息实体中拿
//        // 获取用户
//        Long userId = voucherOrder.getUserId();
//        //创建锁对象
//        RLock redisLock = redissonClient.getLock("lock:order:"+userId);
//        //尝试获取锁
//        boolean isLock = redisLock.tryLock();
//
//        //4.判断是否获取锁成功
//        if(!isLock){
//            //获取锁失败,直接返回失败或者重试
//            log.error("不允许重复下单!");
//            return;
//        }
//        try{
//            //获取代理对象(事务)
//            IVoucherOrderService proxy = (IVoucherOrderService) AopContext.currentProxy();
//            proxy.createVoucherOrder(voucherOrder);
//        }finally {
//            if (redisLock.isHeldByCurrentThread()) {
//                redisLock.unlock();
//            }
//        }
///*        Long voucherId = voucherOrder.getVoucherId();
//        //2.扣减库存
//        boolean success = seckillVoucherService.update().setSql("stock=stock-1")
//                .eq("voucher_id", voucherId)
//                //======判断当前库存是否大于0就可以决定是否能抢池子中的券了
//                .gt("stock", 0)
//                .update();
//        //3.创建订单
//        if(success) save(voucherOrder);*/
//    }
//
//
//    @Resource
//    RabbitTemplate rabbitTemplate;
//    @Override
//    public Result seckillVoucher(Long voucherId) {
//        //1.执行lua脚本,判断当前用户的购买资格
//        Long userId = UserHolder.getUser().getId();
//        Long result = stringRedisTemplate.execute(
//                SECKILL_SCRIPT,
//                Collections.emptyList(),
//                voucherId.toString(), userId.toString());
//        if (result != 0) {
//            //2.不为0说明没有购买资格
//            return Result.fail(result==1?"库存不足":"不能重复下单");
//        }
//        //3.走到这一步说明有购买资格,将订单信息存到消息队列
//        VoucherOrder voucherOrder = new VoucherOrder();
//        long orderId = redisIdWorker.nextId("order");
//        voucherOrder.setId(orderId);
//        voucherOrder.setUserId(UserHolder.getUser().getId());
//        voucherOrder.setVoucherId(voucherId);
//        //存入消息队列等待异步消费
//        rabbitTemplate.convertAndSend("hmdianping.direct","direct.seckill",voucherOrder);
//        return Result.ok(orderId);
//    }
//
//
//
//    @Transactional
//    public void createVoucherOrder(VoucherOrder voucherOrder){
//        // 5.一人一单逻辑
//        // 5.1.用户id
//        //6.扣减库存
//        Long voucherId = voucherOrder.getVoucherId();
//        boolean success = seckillVoucherService.update()
//                .setSql("stock= stock -1") // set stock = stock -1
//                .eq("voucher_id", voucherId)
//                .gt("stock",0)// where id = ? and stock > 0
//                .update();
//        if (!success) {
//            //扣减库存
//            log.error("库存不足!");
//            return ;
//        }
//
//
//        save(voucherOrder);
//
//    }

添加以下内容

    // 原先秒杀接口,用来测试接口耗时@Overridepublic Result seckillVoucher(Long voucherId) {// 1.查询优惠券SeckillVoucher voucher = seckillVoucherService.getById(voucherId);// 2.判断秒杀是否开始if (voucher.getBeginTime().isAfter(LocalDateTime.now())) {// 尚未开始return Result.fail("秒杀尚未开始!");}// 3.判断秒杀是否已经结束if (voucher.getEndTime().isBefore(LocalDateTime.now())) {// 尚未开始return Result.fail("秒杀已经结束!");}// 4.判断库存是否充足if (voucher.getStock() < 1) {// 库存不足return Result.fail("库存不足!");}// 5.一人一单逻辑// 5.1.用户idLong userId = UserHolder.getUser().getId();int count = query().eq("user_id", userId).eq("voucher_id", voucherId).count();// 5.2.判断是否存在if (count > 0) {// 用户已经购买过了return Result.fail("用户已经购买过一次!");}//6,扣减库存boolean success = seckillVoucherService.update().setSql("stock= stock -1").eq("voucher_id", voucherId).update();if (!success) {//扣减库存return Result.fail("库存不足!");}//7.创建订单VoucherOrder voucherOrder = new VoucherOrder();// 7.1.订单idlong orderId = redisIdWorker.nextId("order");voucherOrder.setId(orderId);voucherOrder.setUserId(userId);// 7.3.代金券idvoucherOrder.setVoucherId(voucherId);save(voucherOrder);return Result.ok(orderId);}@Overridepublic void createVoucherOrder(VoucherOrder voucherOrder) {}@Overridepublic void handleVoucherOrder(VoucherOrder voucherOrder) {}

测试结果如下:400ms

在这里插入图片描述

5. 测试缓存穿透

修改http请求如下

在这里插入图片描述

1000并发下

在这里插入图片描述

10000并发下

在这里插入图片描述

http://www.lryc.cn/news/536560.html

相关文章:

  • 盛铂科技 SCP4006/4018/4040:国产袖珍式功率计 射频微波功率探头 平均功率计
  • 数据科学之数据管理|统计学
  • C++ 设计模式-建造者模式
  • 从零搭建:Canal实时数据管道打通MySQL与Elasticsearch
  • Baumer工业相机堡盟工业相机如何通过BGAPI SDK实现一次触发控制三个光源开关分别采集三张图像(C#)
  • 网络安全用centos干嘛 网络安全需要学linux吗
  • 【React】react-redux+redux-toolkit实现状态管理
  • 如何通过AI轻松制作PPT?让PPT一键生成变得简单又高效
  • Springer |第七届2025年区块链、人工智能和可信系统国际会议
  • 新一代SCADA: 宏集Panorama Suite 2025 正式发布,提供更灵活、符合人体工学且安全的应用体验
  • AI在电竞比分网中的主要应用场景
  • 前端快速生成接口方法
  • 【Pico】使用Pico进行无线串流搜索不到电脑
  • 机柜机箱制冷风扇在使用过程中突然停止运转的原因
  • Python函数返回值250214
  • call、apply、bind 详解
  • 详解电子邮箱工作原理|SMTP、POP3、IMAP、SPF、MIME
  • QT笔记——QPlainTextEdit
  • Qt使用pri和pro文件进行模块化编程
  • Linux-文件基本操作
  • 自己部署 DeepSeek 助力 Vue 开发:打造丝滑的时间线(Timeline )
  • 初窥强大,AI识别技术实现图像转文字(OCR技术)
  • 【Apache Paimon】-- 作为一名小白,如何系统地学习 Apache paimon?
  • Elasticvue使用总结
  • 尚硅谷爬虫note002
  • 小白零基础如何搭建CNN
  • 在vivado中对数据进行延时,时序对齐问题上的理清
  • 《只狼》运行时提示“mfc140u.dll文件缺失”是什么原因?要怎么解决?
  • vue学习笔记7
  • Unity 增量打包AssetBundle