/**
* @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;
}
转载于:https://my.oschina.net/u/1186749/blog/664078