/** * @desc uid發生器 * @return int */ public function genNewUid(){ $_REDIS = RedisHandle::getInstance()->redis(); $key = "UID_GUID_JUANPI"; $lockkey = $key."_lock"; $islock = $_REDIS->incr($lockkey); $_REDIS->expire($lockkey,10);//保證了執行解鎖命令以前的邏輯不會再進來新的userid,避免重複 $stime = microtime(true); $uid = $_REDIS->get($key); //uid 丟失 查看是否被鎖 while(!empty($uid) && !empty($islock) && intval($islock)>1){ $etime = microtime(true); if($etime-$stime>3){ throw_exception("guid生成失敗,線程被鎖定");//@todo 肯定返回 } usleep(100); $islock = $_REDIS->incr($lockkey); } //若是沒有從redis中獲取到上一次獲取到的user表的最大值 if(empty($uid)){ //從數據庫中獲取最大的id $uid = $this->getMaxUsersUid(); if($uid>0){ $_REDIS->incrby($key,$uid); }else{ $_REDIS->del($lockkey); throw_exception("guid生成失敗,線程已釋放"); } } $uid= $_REDIS->incr($key);//新的uid爲增長1同時新的最大值會當前的uid $_REDIS->del($lockkey);//解鎖 return $uid; }