PHP:如何避免商品超卖?

2019-12-31  本文已影响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")
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读