Maison > cadre php > PensezPHP > Comment thinkphp utilise Redis pour contrôler la concurrence

Comment thinkphp utilise Redis pour contrôler la concurrence

藏色散人
Libérer: 2021-01-06 09:43:32
avant
3193 Les gens l'ont consulté

Ce qui suit est la colonne du didacticiel du framework thinkphp pour vous présenter comment thinkphp utilise Redis pour contrôler la simultanéité. J'espère que cela sera utile aux amis dans le besoin !

auteur:il
qq:760863706
tp:3.2.3
date:2018 -10-19

Projet de développement de cadre Tp, l'exigence est de contrôler le volume d'accès d'une certaine entreprise en même temps, d'utiliser le mécanisme de verrouillage Redis pour atteindre l'objectif, de créer une concurrence de fonction publique dans la méthode tp public

/**
*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(&#39;queue&#39;);//自增
        if ($redis->get(&#39;clock&#39;) == $random) {//当clock值满足条件
            $redis->del(&#39;clock&#39;);//删除$random随机数
        }
        $process = &#39;处理具体的业务逻辑中,耗时不定,当前时间戳:&#39;.time();

        $endRandom = mt_rand();//随机数
        $end = $redis->set(&#39;clock&#39;, $endRandom, array(&#39;nx&#39;, &#39;ex&#39; => 10));//redis加锁,锁有效期10秒
        while (!$end) 
        {
            usleep(100000);//沉睡100毫秒
            $end = $redis->set(&#39;clock&#39;, $endRandom, array(&#39;nx&#39;, &#39;ex&#39; => 10));//redis加锁,锁有效期10秒
        }
        $redis->decr(&#39;queue&#39;);//自减
        if ($redis->get(&#39;clock&#39;) == $endRandom) {//当clock值满足条件
            $redis->del(&#39;clock&#39;);//删除$endRandom随机数
        }
        return $process;
    }else{
        if ($redis->get(&#39;clock&#39;) == $random) {
            $redis->del(&#39;clock&#39;);
        }
        usleep(200000);//沉睡200毫秒
        concurrence();//递归再次调用
    }

}
Copier après la connexion

Dans le contrôleur, appelez les fonctions publiques et gérez les affaires associées

Pour plus de connaissances liées à la programmation, veuillez visiter : Tutoriel de programmation ! !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal