小編給大家分享一下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框架開(kāi)發(fā)的項(xiàng)目,需求是想控制某項(xiàng)業(yè)務(wù)同一時(shí)刻的訪問(wèn)量,用redis鎖機(jī)制來(lái)實(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è)資訊頻道!