redis集群简单设置方法详解数据库

redis集群简单设置方法

先把redis ip放到数组里

$ss=[1,2]

然后 

$key='wef'; 
echo abs(crc32($key)%2);

根据输出来决定放在哪个redis服务器

ps:如果服务器数量增加了 切记先把redis缓存全部清空 再执行 不然会乱调  当然也可以采取强一致性的写法 当然我不推荐 性能降低了

下面是为了保证均衡和强一致的做法

<?php 
/** 
 * 一致性hash分布式算法 
 * @param $key 
 * @return int 
 * 实现步骤 
 * 1.先将0~ 是32位最大带符号整数(0x7FFFFFFF) 想象成一个闭环 
 * 2.将服务器列表通过hash算法分布在 圆环之中 
 * 3.将key值也分布在圆环之中 
 * 4.通过_isSorted判断服务器是否需要进行倒序排序 排序后遍历服务器 找到最近的服务器 返回 
 * hash算法是不保证平衡的 为了尽量保证平衡性 我们应该加入虚拟节点数 将一个服务器节点虚拟化成为多个 较大程度上保证了平衡性 
 */ 
class FlexiHash{ 
    private $_serverList = array(); 
    private $_isSorted = false; 
    private $_virtual_node_num = 20;//虚拟节点数 服务器越少 增加的虚拟节点数应该越多 
    //通过hash算法返回一个整数值 
    protected function myHash($key){ 
        $md5 = substr(md5($key),0,8); 
        $seed = 31; //种子值 
        $hash=0; 
        for($i=0;$i<8;$i++){ 
            $hash = $hash*$seed+ord($md5{$i}); //ord 返回ascii值 
            $i++; 
        } 
        return $hash&0x7FFFFFFF; //0x7FFFFFFF表示最大值 
    } 
    //添加服务器 
    function addServer($server){ 
        $hash =$this->myHash($server. '#1'); 
        if(!isset($this->_serverList[$hash])) { 
            for ($i = 1; $i <= $this->_virtual_node_num; $i++) { 
                $hash = $this->myHash($server . '#' . $i); 
                $this->_serverList[$hash] = $server; 
            } 
        } 
        $this->_isSorted = false; 
        return true; 
    } 
    //删除服务器 
    function removeServer($server){ 
        for ($i = 1; $i <= $this->_virtual_node_num; $i++) { 
            $hash = $this->myHash($server . '#' . $i); 
            unset($this->_serverList[$hash]); 
        } 
        $this->_isSorted = false; 
        return true; 
    } 
    //获取服务器 
    function lookup($key){ 
        $hash =$this->myHash($key); 
        if(!$this->_isSorted){ 
            krsort($this->_serverList,SORT_NUMERIC); 
            $this->_isSorted = true; 
        } 
        foreach($this->_serverList as $pos=>$server){ 
            if($hash >= $pos) return $server; 
        } 
        return end($this->_serverList); 
    } 
    public function getServerList(){ 
        krsort($this->_serverList,SORT_NUMERIC); 
        return $this->_serverList; 
    } 
}
    $hserver = new /FlexiHash(); 
//添加服务器 
$hserver->addServer('192.168.1.1'); 
$hserver->addServer('192.168.1.2'); 
$hserver->addServer('192.168.1.3'); 
$hserver->addServer('192.168.1.4'); 
$hserver->addServer('192.168.1.5'); 
$key1 = 'Key1111'; 
$key2 = 'Key2222'; 
$key2 = 'Key3333'; 
$key2 = 'Key4444'; 
$key2 = 'Key5555'; 
$key2 = 'Key6666'; 
echo "save key1 in server: " . $hserver->lookup($key1) . PHP_EOL; 
echo "save key2 in server: " . $hserver->lookup($key2) . PHP_EOL; 
echo "save key1 in server: " . $hserver->lookup($key3) . PHP_EOL; 
echo "save key2 in server: " . $hserver->lookup($key4) . PHP_EOL; 
echo "save key1 in server: " . $hserver->lookup($key5) . PHP_EOL; 
echo "save key2 in server: " . $hserver->lookup($key6) . PHP_EOL; 
echo "================================================" . PHP_EOL; 
//移除服务器 key值将自动转义到下一台服务器 
$hserver->removeServer('192.168.1.4'); 
echo "save key1 in server: " . $hserver->lookup($key1) . PHP_EOL; 
echo "save key2 in server: " . $hserver->lookup($key2) . PHP_EOL; 
echo "save key1 in server: " . $hserver->lookup($key3) . PHP_EOL; 
echo "save key2 in server: " . $hserver->lookup($key4) . PHP_EOL; 
echo "save key1 in server: " . $hserver->lookup($key5) . PHP_EOL; 
echo "save key2 in server: " . $hserver->lookup($key6) . PHP_EOL; 
echo "================================================" . PHP_EOL; 
//恢复故障服务器 key值将恢复原来服务器 
$hserver->addServer('192.168.1.4'); 
echo "save key1 in server: " . $hserver->lookup($key1) . PHP_EOL; 
echo "save key2 in server: " . $hserver->lookup($key2) . PHP_EOL; 
echo "save key1 in server: " . $hserver->lookup($key3) . PHP_EOL; 
echo "save key2 in server: " . $hserver->lookup($key4) . PHP_EOL; 
echo "save key1 in server: " . $hserver->lookup($key5) . PHP_EOL; 
echo "save key2 in server: " . $hserver->lookup($key6) . PHP_EOL;

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/4076.html

(0)
上一篇 2021年7月16日
下一篇 2021年7月16日

相关推荐

发表回复

登录后才能评论