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('抢购失败'); }