用戶表分表後如何維護user_id

/**
     * @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;
    }
相關文章
相關標籤/搜索