下面由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中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号