千家信息网

PHP实现一致性hash

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,
千家信息网最后更新 2025年02月01日PHP实现一致性hash
serverList[$server])) {            //增加虚拟节点            for ($i = 0; $i < $this->virtualPosNum; $i++) {                $pos = $this->cHash($server . '#' . $i);                //存放虚拟节点存放的对应的服务器                $this->virtualPos[$pos] = $server;                //存放单台服务器包含的所有节点                $this->serverList[$server][] = $pos;            }            //虚拟节点根据位置排序            ksort($this->virtualPos, SORT_NUMERIC);        }    }    /**     * 移除一台服务器(循环所有的虚节点,删除值为该服务器地址的虚节点)     * @param $key     * @return bool     */    public function removeServer($key)    {        if (isset($this->serverList[$key])) {            //删除一台服务器上的所有虚节点            foreach ($this->serverList[$key] as $pos) {                unset($this->virtualPos[$pos]);            }            //删除对应服务器            unset($this->serverList[$key]);        }    }    /**     * 在当前的服务器列表中找到合适的服务器存放数据     * @param $key 键名     * @return mixed 返回服务器IP地址     */    public function lookup(string $key)    {        $point = $this->cHash($key);//落点的hash值        $finalServer = current($this->virtualPos);//先取圆环上最小的一个节点当成结果(数组的第一个索引单元)        //找到虚拟节点最接近的服务器        foreach ($this->virtualPos as $pos => $server) {            if ($point <= $pos) {                $finalServer = $server;                break;            }        }        reset($this->virtualPos);//重置圆环的指针为第一个(重置数组的指针)        return $finalServer;    }}$hashServer = new MyConsistentHash();$hashServer->addServer('192.168.1.1');$hashServer->addServer('192.168.1.2');$hashServer->addServer('192.168.1.3');$hashServer->addServer('192.168.1.4');$hashServer->addServer('192.168.1.5');$hashServer->addServer('192.168.1.6');$hashServer->addServer('192.168.1.7');$hashServer->addServer('192.168.1.8');$hashServer->addServer('192.168.1.9');$hashServer->addServer('192.168.1.10');echo "增加十台服务器192.168.1.1~192.168.1.10
";echo "保存 key1 到 server :".$hashServer->lookup('key1') . '
';echo "保存 key2 到 server :".$hashServer->lookup('key2') . '
';echo "保存 key3 到 server :".$hashServer->lookup('key3') . '
';echo "保存 key4 到 server :".$hashServer->lookup('key4') . '
';echo "保存 key5 到 server :".$hashServer->lookup('key5') . '
';echo "保存 key6 到 server :".$hashServer->lookup('key6') . '
';echo "保存 key7 到 server :".$hashServer->lookup('key7') . '
';echo "保存 key8 到 server :".$hashServer->lookup('key8') . '
';echo "保存 key9 到 server :".$hashServer->lookup('key9') . '
';echo "保存 key10 到 server :".$hashServer->lookup('key10') . '
';echo "
";print_r($hashServer->virtualPos);
0