<?php
class ConsistentHashMemcache
{
private $virtualNode='';
private $realNode=array();
private $servers=array();
public function __construct($servers, $virtualNode=64)
{
$this->servers=$servers;
$this->realNode=array_keys($servers);
$this->virtualNode=$virtualNode;
}
private function hash($str)
{
return sprintf('%u',crc32($str));
}
private function dealNode($realNode, $virtualNode)
{
$totalNode=array();
foreach ($realNode as $v)
{
for($i=0; $i<$virtualNode; $i++)
{
$hashNode=$this->hash($v.'-'.$i);
$totalNode[$hashNode]=$v;
}
}
ksort($totalNode);
return $totalNode;
}
private function getNode($key)
{
$totalNode=$this->dealNode($this->realNode, $this->virtualNode);
$hashNode=$this->hash($key);
foreach ($totalNode as $k => $v)
{
if($k >= $hashNode)
{
echo $v;
return $v;
}
}
return reset($totalNode);
}
private function getMemcached($key)
{
$node=$this->getNode($key);
echo $key.'真实节点:'.$node.'<br/>';
$host=$this->servers[$node]['host'];
$port=$this->servers[$node]['port'];
$m= new memcache();
$m->addserver($host, $port);
return $m;
}
public function setKey($key, $value)
{
$m=$this->getMemcached($key);
return $m->set($key, $value);
}
public function getKey($key)
{
$m=$this->getMemcached($key);
return $m->get($key);
}
}
$arr=array(
array('host'=>'192.168.1.23', 'port'=>'11213'),
array('host'=>'127.0.0.1', 'port'=>'11211'),
array('host'=>'192.168.1.195', 'port'=>'11212'),
);
$mod=new ConsistentHashMemcache($arr);
$mod->setKey('梅','11111');
转载请注明原文地址: https://www.6miu.com/read-25080.html