信息发布→ 登录 注册 退出

thinkphp如何利用redis控制并发

发布时间:2021-01-05

点击量:

下面由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  # date  # 并发  # redis  # 随机数  # 加锁  # 递归  # 给大家  # 来实现  # 相关知识  # 解锁  # 加减  # 某项  # 器中  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!