美文网首页
java订单抢购业务解决方案(抢购排队)

java订单抢购业务解决方案(抢购排队)

作者: 姬拉 | 来源:发表于2022-06-09 14:54 被阅读0次

刚接手一个小站点,排队下单业务,由于普通时间业务量不大,在抢购活动(1000套)进行时,遇到数据库读取瓶颈。如下是一种轻便解决方案思路,有不足的大神指点一二。

说明:通过全局变量,限制下单数量和排队数量,在队列未消化前,让客户端等待下次发起

--全局变量,卡单,订单限制

/**
 * Created by lala on 2022/6/8.
 */
public  class Tools {
    //全局变量,当前出单数量
    public static int out_count = 0;
    //最大的处理量
    public volatile static int maxtodo=0;
}

--创建线程池,模拟多线程下单

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
 * Created by lala on 2022/6/8.
 */
public class MultiThread {

    //线程池
    ExecutorService executorService = Executors.newCachedThreadPool();

    public void testorder(){
        ThreadService threadService = new ThreadService();
        //线程池操作
        executorService.submit(()->threadService.order());
        executorService.submit(()->threadService.order());
        executorService.submit(()->threadService.order());
        executorService.submit(()->threadService.order());
    }
}

--下单业务
/**

  • Created by lala on 2022/6/8.
    */
public class ThreadService {
    static ThreadService instance = new ThreadService();
    public void order() {
        //当前线程执行数量
        int docount = 0;
        //当最订单不满足接着循环
        while (Tools.out_count<1000){
            synchronized (instance) {
                //再次校验
                if (Tools.out_count >=1000) {
                    break;
                }
                //最大排队数量
                if(Tools.maxtodo>=10){
                    //通知客户端等待,结束当前http请求
                    continue;
                }
                //开始执行新的订单,maxtodo+1
                Tools.maxtodo++;
                docount++;
                try {
                    //执行的时间
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //执行完总数量+一单
                Tools.out_count++;
                //执行结束当前排队减1
                Tools.maxtodo--;
            }
        }
        System.out.println("线程:" + Thread.currentThread().getName() + "出单了:" + docount + ", 总出单=" + Tools.out_count);
    }
}

--测试方法

public class test {
    public static void main(String[] args) {
        MultiThread multiThread = new MultiThread();
        multiThread.testorder();
        multiThread.executorService.shutdown();
    }
}

相关文章

  • java订单抢购业务解决方案(抢购排队)

    刚接手一个小站点,排队下单业务,由于普通时间业务量不大,在抢购活动(1000套)进行时,遇到数据库读取瓶颈。如下是...

  • 只用数据库设计高效抢购业务

    不使用缓存(redis、memcache),如何设计高效抢购业务呢?常见的抢购业务主要有:商品抢购券抢购红包抢购今...

  • 订单抢购中常见的并发问题及解决

    订单抢购中常见的并发问题及解决 抢购遇到的并发问题 常见的较优的解决方案 非阻塞的文件排他锁 redis队列,po...

  • redis实现秒杀抢购

    秒杀订单提前写入 秒杀抢购取出

  • Java高并发解决方案

    主要讲了高并发场景:Java 高并发解决方案(电商的秒杀和抢购)主讲了电商秒杀业务,但是给的源码不全,有些关键逻辑...

  • 排队抢购宜家地毯的都是些什么人?

    连宜家地毯都需要排队抢购了吗? 是的,没错。 不仅是排队抢购,想要得到这款地毯,你可能还需要支帐篷熬夜、抽签、甚至...

  • 商城性能优化技术工作总结

    大前提:主要针对商城促销日抢购是10秒以内完成20万订单的抢购。为了这个目标,进行了如下两个方面的优化:一 程序t...

  • 大成微课No.32:“品牌创新力”是企业最高水平,唯有具备了“道

    企业如能把品牌做得响到顾客争相上门排队抢购(如第一张PPT),那什么线上或线下的销售业务难题都能迎刃而解。但...

  • 抢购

    方案一: 收到抢购请求后,对商品执行库存 -1 操作。然后给用户生成一个订单。 这系列操作中,并发问题在于:如果库...

  • 抢购

    今天,不,准确的说是昨晚,一直很期盼多宝出牙,可是总也看不见小牙的影子,昨晚睡前玩耍的时候,试着摸了一下他...

网友评论

      本文标题:java订单抢购业务解决方案(抢购排队)

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