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