php mysql 秒杀_基于Redis的PHP+MySQL商品秒杀与超卖场景基础解决方法

// 抢购下单

public function goodsOrder()

{

$redis = self::Redis();

$db = self::mysql();

$goodsId = 1;

$sql = "select id,inventory,price from hw_goods where id=".$goodsId;

$stmt = $db->query($sql);

$row = $stmt->fetch(PDO::FETCH_ASSOC);

$redis = self::Redis();

$count = $redis->rpop('num');//每次从num取出1

if($count == 0){

$this->log(0, 'no num redis');

echo '已没有库存';

} else {

$this->doOrder($row, 1);

}

}

如果redis队列数量变成0了,就是没有库存了,这个时候不做订单处理了,如果不是0就要更新库存,生成订单。

public function doOrder($goods, $goodsNum)

{

$orderNo = $this->orderNo();

$number = $goods['inventory'] - $goodsNum;

if ($number < 0) {

$this->log(0, '已没有库存');

echo '已没有库存';

return false;

}

$db = self::mysql();

try {

$db->beginTransaction(); //启动事务

$sql = "INSERT INTO `hw_order` (user_id,order_sn,status,goods_id,o_num,price,created_at) VALUES (:user_id,:order_sn,:status,:goods_id,:sku_id,:o_num,:price,:created_at)";

$stmt = $db->prepare($sql);

$stmt->execute([

':user_id' => rand(1, 500),

':order_sn' => $orderNo,

':status' => 1,

':goods_id' => $goods['id'],

':o_num' => $goodsNum,

':price' => $goods['price'] * 100,

':created_at' => date('Y-m-d H:i:s'),

]);

$sql2 = "update hw_goods set inventory=inventory-".$goodsNum." where inventory>0 and id=".$goods['id'];

$res = $db->exec($sql2);

$db->commit(); //提交事务

$this->log(1, '下单和库存扣减成功');

} catch (Exception $e) {

$db->rollBack(); //回滚事务

$this->log(0, '下单失败');

}

}

这样就ok,整体逻辑比较简单,实现方法也比较简单。当变为0之后,就可以返回给用户其他等待页面了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值