美文网首页
PHP:如何避免商品超卖?

PHP:如何避免商品超卖?

作者: 如梦又似幻 | 来源:发表于2019-12-31 18:01 被阅读0次

    正常情况下,每次下单之前要判断促销商品的数量是否足够,不够时不允许下单。
    也可以利用关系型数据库的事务来完成下单

    $goods = Good::find(1234);
    if($goods->stock > 0)
        $db->query('update shop set number = number -1 where id = 1234);
    

    当访问量较大或者需要秒杀商品时,这种方法还是会产生超卖,而且对数据库的性能影响很大(MySQL会出现连接数不够用的情况)。

    秒杀情况下,可以使用redis的队列,把需要秒杀的商品放入缓存中,为每个缓存商品建立请求队列,以最快的速度响应客户端,异步写入数据库。

    public function push() {
        // 秒杀产品写入队列
        $redis->lpush("queue", 1);
    }
    
    // 后台异步执行
    public function pop() {
        while (($key = $redis->rpop("queue"))) {
            $shop = Shop::find(123456);
            if ($shop->number > 0) {
                DB::update("update shop set number = number - 1 where id = 1")
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:PHP:如何避免商品超卖?

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