小编给大家分享一下thinkphp利用redis控制并发的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
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 <= 10) { $redis->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利用redis控制并发的方法”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。