美文网首页
订单抢购中常见的并发问题及解决

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

作者: happywho250 | 来源:发表于2019-07-12 15:13 被阅读0次

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

抢购遇到的并发问题

查询库存  当库存大于0的时候执行创建订单,减去库存数量等操作,但是在判断库存是否大于0时,并发问题,导致库存被减为负数

常见的较优的解决方案

非阻塞的文件排他锁

$fp = fopen('lock.txt','w+');
    
$lock_status = flock($fp,LOCK_EX|LOCK_NB); // 文件执行非阻塞锁定.

if(!$lock_status) { //当该文件被锁定时,无法再次被锁定
    echo "网络繁忙,请稍后再试";
    return;
}

// 执行库存查询,订单生产 库存减少等操作.

// 当时间执行结束以后,执行释放锁.

$unlock_status = flock($fp,LOCK_UN);

if ($unlock_status) {
    echo "解锁成功";
}

fclose($fp);

redis队列,pop是原子性的, 即使很多用户同时到达,也是依次执行

// 1.现将库存全部排入队列中.
$store = 100; // 原定库存100
$store_key = "good_mq";

$redis = new Redis();
$redis->connect('127.0.0.1',6379);

$count = $store;

// 将库存添加到队列中.
if($count) {
    for($i=0;$i<$count;$i++) {
        $redis->rpush($store_key,1);
    }
}


// 2. 检查库存 执行抢购.
// 检查是否还有库存
$is_has_good = $redis->rPop($store_key);

if (!$is_has_good) {
    echo "已经被抢购完毕!";
}

// 执行抢购逻辑.
echo "抢购成功!存货:".$redis->llen($store_key);

相关文章

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

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

  • 并发常见问题及解决

    父子线程交互不当 真实业务场景中,通常会出现并发解决问题以充分利用CPU资源,为了防止过多的系统资源消耗在...

  • php使用redis实现高并发下的抢购功能

    抢购、秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个: 高并发对数据库产生的压力 竞争状态下如何解决库存...

  • 消息队列及常见消息队列介绍

    消息队列及常见消息队列介绍 导语 : 消息队列是分布式系统中重要的组件,在很多生产环境如商品抢购等需要控制并发量的...

  • Redis抢购设计章

    抢购是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如何解决库...

  • redis高并发下如何抢购防止超卖问题

    抢购是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如何解决库...

  • 抢购

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

  • 高并发下的抢购/秒杀功能

    抢购/秒杀是如今很常见的一个应用场景,那么高并发竞争下如何解决超抢(或超卖库存不足为负数的问题)呢? 常规写法: ...

  • redis实现高并发下的抢购/秒杀功能

    抢购/秒杀是如今很常见的一个应用场景,那么高并发竞争下如何解决超抢(或超卖库存不足为负数的问题)呢? 常规写法: ...

  • ReentrantLock源码分析(一)

    工作中或多或少都会遇到并发问题,解决此类问题最好的解决方法就是通过锁,本文通过分析最常见的类ReentrantLo...

网友评论

      本文标题:订单抢购中常见的并发问题及解决

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