当前位置:Gxlcms > php框架 > thinkphp如何利用redis控制并发

thinkphp如何利用redis控制并发

时间:2021-07-01 10:21:17 帮助过:30人阅读

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

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

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

  1. /**
  2. *redis控制并发
  3. **/
  4. function concurrence(){
  5. //实例化redis
  6. $redis = new \Redis();
  7. $redis->connect(C('REDIS_HOST'),C('REDIS_PORT'));
  8. $redis->auth(C('REDIS_AUTH'));
  9. //进入队列及出列,queue在加减的时候,要保证操作的唯一性,此时加锁,完成后在解锁
  10. $random = mt_rand();//生成随机数
  11. $start = $redis->set('clock', $random, array('nx', 'ex' => 10));//redis加锁,锁有效期10秒
  12. while (!$start)
  13. {
  14. usleep(100000);//沉睡100毫秒
  15. $start = $redis->set('clock', $random, array('nx', 'ex' => 10));//redis加锁,锁有效期10秒
  16. }
  17. $queue = $redis->get('queue');
  18. if ($queue <= 10)
  19. {
  20. $redis->incr('queue');//自增
  21. if ($redis->get('clock') == $random) {//当clock值满足条件
  22. $redis->del('clock');//删除$random随机数
  23. }
  24. $process = '处理具体的业务逻辑中,耗时不定,当前时间戳:'.time();
  25. $endRandom = mt_rand();//随机数
  26. $end = $redis->set('clock', $endRandom, array('nx', 'ex' => 10));//redis加锁,锁有效期10秒
  27. while (!$end)
  28. {
  29. usleep(100000);//沉睡100毫秒
  30. $end = $redis->set('clock', $endRandom, array('nx', 'ex' => 10));//redis加锁,锁有效期10秒
  31. }
  32. $redis->decr('queue');//自减
  33. if ($redis->get('clock') == $endRandom) {//当clock值满足条件
  34. $redis->del('clock');//删除$endRandom随机数
  35. }
  36. return $process;
  37. }else{
  38. if ($redis->get('clock') == $random) {
  39. $redis->del('clock');
  40. }
  41. usleep(200000);//沉睡200毫秒
  42. concurrence();//递归再次调用
  43. }
  44. }

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

以上就是thinkphp如何利用redis控制并发的详细内容,更多请关注gxlcms其它相关文章!

人气教程排行