thinkphp如何利用redis控制并发

下面由thinkphp框架教程栏目给大家介绍thinkphp 利用redis 控制并发的方法,希望对需要的朋友有所帮助!

author:he qq:760863706 tp:3.2.3 date:2018-10-19

tp框架开发的项目,需求是想控制某项业务同一时刻的访问量,用redis锁机制来实现目的,在tp公共方法中创建公共函数 concurrence

/** *redis控制并发 **/ function concurrence(){      //实例化redis     $redis = new Redis();     $redis->connect(C('REDIS_HOST'),C('REDIS_PORT'));     $redis->auth(C('REDIS_AUTH'));      //进入队列及出列,queue在加减的时候,要保证操作的唯一性,此时加锁,完成后在解锁     $random = mt_rand();//生成随机数     $start = $redis->set('clock', $random, array('nx', 'ex' => 10));//redis加锁,锁有效期10秒     while (!$start)      {         usleep(100000);//沉睡100毫秒         $start = $redis->set('clock', $random, array('nx', 'ex' => 10));//redis加锁,锁有效期10秒     }     $queue = $redis->get('queue');     if ($queue incr('queue');//自增         if ($redis->get('clock') == $random) {//当clock值满足条件             $redis->del('clock');//删除$random随机数         }         $process = '处理具体的业务逻辑中,耗时不定,当前时间戳:'.time();          $endRandom = mt_rand();//随机数         $end = $redis->set('clock', $endRandom, array('nx', 'ex' => 10));//redis加锁,锁有效期10秒         while (!$end)          {             usleep(100000);//沉睡100毫秒             $end = $redis->set('clock', $endRandom, array('nx', 'ex' => 10));//redis加锁,锁有效期10秒         }         $redis->decr('queue');//自减         if ($redis->get('clock') == $endRandom) {//当clock值满足条件             $redis->del('clock');//删除$endRandom随机数         }         return $process;     }else{         if ($redis->get('clock') == $random) {             $redis->del('clock');         }         usleep(200000);//沉睡200毫秒         concurrence();//递归再次调用     }  }

在控制器中,调用公共函数,处理相关业务

更多编程相关知识,请访问:thinkphp!!

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享