php 利用redis分布式锁秒杀解决超卖问题

2022-10-11 20:19:50 145 0
魁首哥

后续还有优化,目前只有大体思路

public function miaosha(){

php 利用redis分布式锁秒杀解决超卖问题

 $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();

    }  

}

收藏
分享
海报
0 条评论
145
上一篇:PHP开源CRM客户管理系统介绍 下一篇:什么是网站日志 ?网站日志怎么分析

本站已关闭游客评论,请登录或者注册后再评论吧~

忘记密码?

图形验证码