PHP+redis乐观锁防止高并发超卖

<?php
$error_level = error_reporting(0);
$con = new mysqli('localhost','root','root','test');
if(!$con){
    echo "数据库连接失败";
}
$sql = "select * from products where id=1";

$result = mysqli_query($con,$sql);
$aa= mysqli_fetch_row($result);
if($aa[3]>0){

    sleep(1);

    $sql = "update products set store=store-1 where id=1";

    if(mysqli_query($con,$sql)){

        echo "更新成功";
    }

}else{
    echo "没有库存";
}

redis乐观锁防止超卖

<?php
  // ini_set('default_socket_timeout', -1); 
  $redis =new Redis(); 
  $redis->connect("127.0.0.1", 6379);

  $redis->watch('sales');//乐观锁 监视作用 set()  初始值0
  $sales=$redis->get('sales'); 

  $n=100;
  if($sales>=$n){
    exit('秒杀结束');
  }
  //开启事务
  $redis->multi();
  $redis->incr('sales');  //将 key 中储存的数字值增一 ,如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
  $res=$redis->exec(); //成功1 失败0
  if($res){
    //秒杀成功
    include 'db.php';
    $sql="update products set store=store-1 where id=1";
    if($mod->exec($sql)){
      echo "秒杀完成";
    }
  }else{ 
      exit('抢购失败');
  }

 

posted @ 2020-01-09 10:27  骏码信息  阅读(1886)  评论(0编辑  收藏  举报