美文网首页
秒杀接口优化

秒杀接口优化

作者: totohui | 来源:发表于2018-04-30 16:48 被阅读0次

秒杀接口优化

1. 系统初始化,把商品库存数量加载到Redis

MiaoshaController实现InitializingBean

public void afterPropertiesSet() throws Exception {

    List goodsList = goodsService.listGoodsVo();

    if (goodsList == null) {

        return;

    }

    for (GoodsVo goods : goodsList) {               redisService.set(GoodsKey.getMiaoshaGoodsStock, "" + goods.getId(),     goods.getStockCount()); localOverMap.put(goods.getId(), false);

    }

}

2.收到请求,Redis预减库存,库存不足,直接返回,否则进入3

先判断是否是重复秒杀,然后预减库存,如果库存数量小于0,返回秒杀结束;

否则请求入队

@ResponseBody

public Result miaosha(Model model, MiaoshaUser user, @RequestParam("goodsId") long goodsId) {

    model.addAttribute("user", user);

    if (user == null) {

        return Result.error(CodeMsg.SESSION_ERROR); } // 判断是否重复秒杀

    }

    MiaoshaOrder order =  orderService.getMiaoshaOrderByUserIdGoodsId(user.getId(), goodsId);

    if (order != null) {

        return Result.error(CodeMsg.REPEATE_MIAOSHA); } // 内存标记,减少redis访问

    }

     boolean over = localOverMap.get(goodsId);

    if (over) {

        return Result.error(CodeMsg.MIAO_SHA_OVER);

    }

    // 预减库存

    long stock = redisService.decr(GoodsKey.getMiaoshaGoodsStock, "" + goodsId);// 10

    if (stock < 0) {

        localOverMap.put(goodsId, true);

        return Result.error(CodeMsg.MIAO_SHA_OVER);

    }

    // 入队

    MiaoshaMessage mm = new MiaoshaMessage();

    mm.setUser(user);

    mm.setGoodsId(goodsId); sender.sendMiaoshaMessage(mm);

    return      Result.success(0);// 排队中

}

3.请求入队,立即返回排队中

4.请求出队,生成订单,减少库存

出队后,先判断商品库存是否小于等于0,是否是重复订单,调用miaoshaService.miaosha(user, goods);//减库存,下订单

@Transactional public OrderInfo miaosha(MiaoshaUser user, GoodsVo goods) {

//减库存 下订单 写入秒杀订单

boolean success = goodsService.reduceStock(goods);

if(success) { //order_info maiosha_order

    return orderService.createOrder(user, goods); }

else {

    setGoodsOver(goods.getId());

    return null;

}

}

setGoodsOver就是用redis标记该商品已经卖完了。

OrderService.createOrder(MiaoshaUser user, GoodsVo goods)

OrderInfo orderInfo = new OrderInfo();

...

orderDao.insert(orderInfo);

MiaoshaOrder miaoshaOrder = new MiaoshaOrder(); miaoshaOrder.setGoodsId(goods.getId()); miaoshaOrder.setOrderId(orderInfo.getId()); miaoshaOrder.setUserId(user.getId()); orderDao.insertMiaoshaOrder(miaoshaOrder);

redisService.set(OrderKey.getMiaoshaOrderByUidGid, ""+user.getId()+"_"+goods.getId(), miaoshaOrder);

//最后将哪个用户买了哪件商品放入redis,用于以后判断是否为重复秒杀

5.客户端轮询,是否秒杀成功。

接口的定义:

/**

* orderId:成功

    -1:秒杀失败 

     0: 排队中

*/

@RequestMapping(value = "/result", method = RequestMethod.GET)

@ResponseBody

相关文章

  • 秒杀接口优化

    秒杀接口优化 1. 系统初始化,把商品库存数量加载到Redis MiaoshaController实现Initia...

  • 秒杀:接口优化

    Redis预减库存减少数据库访问 内存标记减少Redis访问 请求先入队缓冲,异步下单,增强用户体验 Rabbit...

  • 3. 秒杀-接口优化

    1.解决超卖和重复秒杀 秒杀动作执行的操作比较多,多线程场景下,将会出现超卖和重复秒杀的情况,这属于异常情况,必须...

  • redis实现秒杀

    秒杀活动内容实现简单的秒杀页面(显示当前秒杀活动状态)和秒杀接口,不需要考虑下订单和退货流程。秒杀接口要求时间到了...

  • SSM实现高并发秒杀功能之DAO层

    一、该秒杀实现哪些功能 1.列出秒杀的商品2.秒杀接口的暴露(到了秒杀的时间,把秒杀的地址暴露出来)3.执行秒杀4...

  • 秒杀系统架构优化思路

    《秒杀系统架构优化思路》 上周参加Qcon,有个兄弟分享秒杀系统的优化,其观点有些赞同,大部分观点却并不同意,结合...

  • Java高并发秒杀业务Api-Service层构建过程

    章节目录 秒杀Service 接口开发工作秒杀业务逻辑编写spring-IOC 管理 service 组件cont...

  • LR-并发下检查功能结果

    这是个秒杀的接口,我需要测试: 1、并发情况下,接口返回结果是否都正确 2、并发情况下,秒杀数据正确性 ok() ...

  • 数据库主键更新死锁问题

    记一次压测数据死锁问题:并发场景为秒杀减库存的场景,使用Jmeter并发调用秒杀接口,秒杀使用数据库乐观锁,主键更...

  • 作业

    请用接口隔离原则优化cache类的设计,画出优化后的类图 接口隔离:

网友评论

      本文标题:秒杀接口优化

      本文链接:https://www.haomeiwen.com/subject/ogmplftx.html