视频教程分类
推荐视频教程
  • 千万级数据并发解决方案(理论+实战)千万级数据并发解决方案(理论+实战)
  • Laravel基础与实战Laravel基础与实战
  • UNI-APP开发(仿饿了么)UNI-APP开发(仿饿了么)
  • ThinkPHP6开发CMS系统ThinkPHP6开发CMS系统
  • 首页 >php框架 >ThinkPHP > 正文

    thinkphp如何利用redis控制并发

    转载2021-01-06 09:43:3201759
    下面由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 <= 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控制并发的详细内容,更多请关注php中文网其它相关文章!

    高并发千万级数据库系统解决方案

    声明:本文转载于:csdn,如有侵犯,请联系admin@php.cn删除

    相关文章

    相关视频


    专题推荐