Home > Article > Backend Development > PHP combines with redis to realize rush purchase, flash sale functions and optimization solutions
Rush buying and flash sales are a very common application scenario nowadays. There are two main problems that need to be solved: one is the pressure caused by high concurrency on the database, and the other is how to solve the correct inventory reduction under competition ( "oversold" problem). For the first question, it is already easy to think of using cache to handle rush purchases and avoid directly operating the database, such as using Redis.
The focus is on the second question
Conventional writing method:
Query the corresponding product Inventory, see if it is greater than 0, and then perform operations such as generating an order. However, when judging whether the inventory is greater than 0, there will be problems under high concurrency, resulting in a negative inventory number
<?php $conn=mysql_connect("localhost","big","123456"); if(!$conn){ echo "connect failed"; exit; } mysql_select_db("big",$conn); mysql_query("set names utf8"); $price=10; $user_id=1; $goods_id=1; $sku_id=11; $number=1; //生成唯一订单 function build_order_no(){ return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8); } //记录日志 function insertLog($event,$type=0){ global $conn; $sql="insert into ih_log(event,type) values('$event','$type')"; mysql_query($sql,$conn); } //模拟下单操作 //库存是否大于0 $sql="select number from ih_store where goods_id='$goods_id' and sku_id='$sku_id'";//解锁 此时ih_store数据中goods_id='$goods_id' and sku_id='$sku_id' 的数据被锁住(注3),其它事务必须等待此次事务 提交后才能执行 $rs=mysql_query($sql,$conn); $row=mysql_fetch_assoc($rs); if($row['number']>0){//高并发下会导致超卖 $order_sn=build_order_no(); //生成订单 $sql="insert into ih_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="update ih_store set number=number-{$number} where sku_id='$sku_id'"; $store_rs=mysql_query($sql,$conn); if(mysql_affected_rows()){ insertLog('库存减少成功'); }else{ insertLog('库存减少失败'); } }else{ insertLog('库存不够'); } ?>
Optimization plan 1:
##Set the inventory field number field to unsigned. When the inventory is 0, because the field cannot be a negative number, false will be returned
1 2 ##34 5 6 //库存减少 $sql="update ih_store set number=number-{$number} where sku_id='$sku_id' and number>0"; $store_rs=mysql_query($sql,$conn); if(mysql_affected_rows()){ insertLog('库存减少成功'); } |
|
The above is the detailed content of PHP combines with redis to realize rush purchase, flash sale functions and optimization solutions. For more information, please follow other related articles on the PHP Chinese website!