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('搶購失敗');
  }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM