thinkphp如何利用redis控制并發

下面由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?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!!

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享