首页 » Web前端 » php散布式秒杀体系技巧_php 运用redis分布式锁秒杀解决超卖问题

php散布式秒杀体系技巧_php 运用redis分布式锁秒杀解决超卖问题

duote123 2024-11-16 0

扫一扫用手机浏览

文章目录 [+]

public function miaosha(){

$uid=uniqid(); //模拟用户id 随机数代替#redis 连接$redis =new \Redis();$redis->connect('127.0.0.1',6379);try{ do{ $list =[]; $key='test_key'; $value =uniqid(); $numkey ='storeid'.'11111'; //商品的Key 用来存商品数量 $redis->watch($numkey); //监听商品数量 #一个用户只能购买一个 if($redis->hget('www',$uid)){ return ['msg'=>'不能重复']; } //加锁 $is_lock = $redis->set($key,$value,['nx','ex'=>'10']); if($is_lock){ $arr[$key] =$value; //记录当前获取锁的用户 $stock = $redis->get($numkey); if($stock<=0){//商品数量为0秒杀结束,删除锁 if($redis->get($key)==$arr[$key]){ $redis->del($key); } return ['msg'=>'结束']; } #开缘由务 $redis->multi(); $redis->decr($numkey); $redis->hSet('www',$uid,'11111'); $redis->lPush('list',$uid); $redis->exec(); #提交事务解锁 if($redis->get($key)==$arr[$key]){ $redis->del($key); } break; }else{ //没有获取锁就寝重试 usleep(5000); } }while(!is_lock); return $redis->lLen('list'); }catch (\Exception $e){ $redis->discard();//redis 回滚 return $e->getMessage(); }

php散布式秒杀体系技巧_php 运用redis分布式锁秒杀解决超卖问题

php散布式秒杀体系技巧_php 运用redis分布式锁秒杀解决超卖问题
(图片来自网络侵删)

}

标签:

相关文章