十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
小編給大家分享一下thinkphp利用redis控制并發(fā)的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)是一家專業(yè)提供佛坪企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計(jì)制作、網(wǎng)站制作、H5響應(yīng)式網(wǎng)站、小程序制作等業(yè)務(wù)。10年已為佛坪眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。
tp框架開發(fā)的項(xiàng)目,需求是想控制某項(xiàng)業(yè)務(wù)同一時(shí)刻的訪問量,用redis鎖機(jī)制來實(shí)現(xiàn)目的,在tp公共方法中創(chuàng)建公共函數(shù) concurrence
/**
*redis控制并發(fā)
**/
function concurrence(){
//實(shí)例化redis
$redis = new \Redis();
$redis->connect(C('REDIS_HOST'),C('REDIS_PORT'));
$redis->auth(C('REDIS_AUTH'));
//進(jìn)入隊(duì)列及出列,queue在加減的時(shí)候,要保證操作的唯一性,此時(shí)加鎖,完成后在解鎖
$random = mt_rand();//生成隨機(jī)數(shù)
$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) {//當(dāng)clock值滿足條件
$redis->del('clock');//刪除$random隨機(jī)數(shù)
}
$process = '處理具體的業(yè)務(wù)邏輯中,耗時(shí)不定,當(dāng)前時(shí)間戳:'.time();
$endRandom = mt_rand();//隨機(jī)數(shù)
$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) {//當(dāng)clock值滿足條件
$redis->del('clock');//刪除$endRandom隨機(jī)數(shù)
}
return $process;
}else{
if ($redis->get('clock') == $random) {
$redis->del('clock');
}
usleep(200000);//沉睡200毫秒
concurrence();//遞歸再次調(diào)用
}
}在控制器中,調(diào)用公共函數(shù),處理相關(guān)業(yè)務(wù)
以上是“thinkphp利用redis控制并發(fā)的方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!