当前位置: 首页 > 后端技术 > PHP

php结合redis实现高并发下抢购杀闪功能

时间:2023-03-29 15:20:07 PHP

抢购和秒杀是现在非常普遍的应用场景。主要解决两个问题:1、高并发对数据库的压力。2、如何解决竞争状态下正确减少库存(“超卖”问题)问题是很容易想到用缓存来处理抢购,避免直接操作数据库,比如用Redis。重点是第二题的常规写法:查询对应商品的库存是否大于0,然后进行生成订单等操作,但是在判断库存是否大于0时,有高并发下会出问题,导致inventory出现负数0){//高并发会导致超卖$order_sn=build_order_no();//构建订单$sql="insertintoih_order(order_sn,user_id,goods_id,sku_id,price)values('$order_sn','$user_id','$goods_id','$sku_id','$price')";$order_rs=mysql_query($sql,$conn);//减少库存$sql="updateih_storesetnumber=number-{$number}wheresku_id='$sku_id'";$store_rs=mysql_query($sql,$conn);if(mysql_affected_rows()){insertLog('减库存成功');}else{insertLog('减库存失败');}}else{insertLog('Insufficientinventory');}?>方案一:设置inventoryfieldnumber字段为unsigned,当inventory为0时,因为该字段不能为负,所以会返回false//库存减少$sql="更新ih_storesetnumber=number-{$number}wheresku_id='$sku_id'andnumber>0";$store_rs=mysql_query($sql,$conn);if(mysql_affected_rows()){insertLog('减库存成功');}方案二:使用mysql事务锁定操作的行0){//生成订单$order_sn=build_order_no();$sql="insertintoih_order(order_sn,user_id,goods_id,sku_id,price)values('$order_sn','$user_id','$goods_id','$sku_id','$price')";$order_rs=mysql_query($sql,$conn);//减少库存$sql="updateih_storesetnumber=number-{$number}wheresku_id='$sku_id'";$store_rs=米ysql_query($sql,$conn);if(mysql_affected_rows()){insertLog('减库存成功');mysql_query("COMMIT");//事务提交后解锁}else{insertLog('减库存失败');}}else{insertLog('存货不足');mysql_query("回滚");}?>