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")
}
}
}