ThinkPHP5+Redis 秒杀demo考虑并发


//php秒杀 redis并发处理
    function miaoshao(){
        
        //根据自己的情况实例化类即可
        $redis = new Redis;
        //连接
        $redis->connect('127.0.0.1', 6379,30);
    
        //获取库存出售的数量,默认为空
        $kuchun = $redis -> get('kucun');
        
        $total  = 100;
        
        if ($kuchun < $total){
            //有库存
            //WATCH命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行。
            //监控一直持续到EXEC命令(事务中的命令是在EXEC之后才执行的,所以在MULTI命令后可以修改WATCH监控的键值)
            //可处理并发情况
            $redis -> watch('kucun');
            //Redis保证一个事务中的所有命令要么都执行,要么都不执行。
            //如果在发送EXEC命令前客户端断线了,则Redis会清空事务队列,事务中的所有命令都不会执行。
            //而一旦客户端发送了EXEC命令,所有的命令就都会被执行,即使此后客户端断线也没关系,因为Redis中已经记录了所有要执行的命令。
            //除此之外,Redis的事务还能保证一个事务内的命令依次执行而不被其他命令插入。试想客户端A需要执行几条命令,同时客户端B发送了一条命令,如果不使用事务,则客户端B的命令可能会插入到客户端A的几条命令中执行。如果不希望发生这种情况,也可以使用事务。
            //开启事务
            $redis->multi();
            $redis->set("kucun",$kuchun+1);
            //执行事务
            $result = $redis->exec();
            if($result){
                
                //剩余数量
                $number = $total - ($kuchun +1);
                
                //$openid 用户id
                $openid = $number;
                $redis-> hset("list","user_".$openid,$kuchun);
                //获取抢购成功的用户
                $data = $redis-> hgetall('list');
                var_dump($data);
                var_dump($number);
            }else{
                var_dump('手气很差哦,再试一下!');
            }
        
        }else{
            var_dump('已经被抢光了');
        }
    }

  Redis事务和watch 学习资料可参考如下链接:

  https://www.cnblogs.com/liuchuanfeng/p/7190654.html


最新回复 (0)
发新帖