009--【*SpringBoot】秒杀/高并发设计

1、参考网址:

  • 使用semaphore防止线程抢占:https://blog.csdn.net/qq_33371766/article/details/80775785
  • ThreadPoolExecutor线程池+Queue缓冲队列实现高并发中进行下单业务:https://blog.csdn.net/u011677147/article/details/80271174
  • SpringBoot秒杀,带页面视图博客:https://www.e-learn.cn/content/java/1274573
  • SpringBoot秒杀,带页面视图代码:https://github.com/TyCoding/springboot-seckill/

2、待梳理点:(目前只是记录,上诉代码设计肯定有问题)

  • 如何进行高并发接口测试?(模拟高并发抢占,导致数据库库存减少为负值)
  • 结合semaphore和redis进行真实的接口修改

3、参看以下几种避免超卖的方式,进行总结:

3.1 参考网址

  • 高并发下减库存操作避免超卖:https://blog.csdn.net/rainyear/article/details/81519254
  • semaphore实现单线程设计: https://blog.csdn.net/qq_33371766/article/details/80775785
  • lock实现单线程设计:https://blog.csdn.net/rainyear/article/details/81519254

3.2 基本思路总结:

  • 方式一: for update 用时5504
select * from PPTEST.TBL_SHOP mm where ID=#{id,jdbcType=VARCHAR} for update

select for update这是数据库行锁,也是我们常用的悲观锁,可用于针对某商品的秒杀操作,但是当出现主键索引和非主键索引同时等待对方时,会造成数据库死锁

  • 方式二:方法加锁,保证只有一个线程执行
方式二:加锁 用时9650
@Override
public void updateShop(String id,Integer num) {
    try {
        lock.lock();
        ShopEntity entity = shopDao.getShop(id);
        System.out.println("原数量是"+entity.getNum()+"我将对原数量减去" + num);
        shopDao.updateShop(id,num);
        entity = shopDao.getShop(id);
        System.out.println("更新后的数量是"+entity.getNum());
    }finally{
        lock.unlock();
    }
}

但是这样是单线程,保证了数据的安全性,但是性能直线下降

  • 方式三:队列执行(让线程排队,接收多线程请求,内部进行单线程处理)
public void updateShop(String id,Integer num) {
    ShopVO shopVO = new ShopVO();
    shopVO.setNum(1);
    shopVO.setId("1");
    try {
        queue.add(shopVO);
    }catch (Exception e) {
        System.out.println("该商品已经秒杀结束了奥!");
    }
}
#秒杀队列执行的方法:
public void realUpdateShop() throws InterruptedException {
    while(!queue.isEmpty()) {
        ShopVO vo = queue.take();
        System.out.println(vo.getNum());
        shopDao.updateShop(vo.getId(),vo.getNum());
    }
}

真实操作参考博客:ThreadPoolExecutor线程池+Queue缓冲队列实现高并发中进行下单业务


4、最终方案:

  • ThreadPoolExecutor线程池+Queue缓冲队列实现高并发中进行下单业务
  • 使用队列,保证内部单个线程操作数据库,可以有效的减少时间,保证数据安全

你可能感兴趣的:(009--【*SpringBoot】秒杀/高并发设计)