看了网上memcached视频教程自己用php写的memcache分布式哈希一致性算法。
<?php
/**
* Class Memcache
* memcache分布式哈希一致性算法
* author mn
* version 1.0
* date 2018/3/1
*/
class MemcacheCtl{
//memcache服务器列表
private static $serArr = [
['host'=>'localhost','port'=>11211],
['host'=>'localhost','port'=>11212],
['host'=>'localhost','port'=>11213],
['host'=>'localhost','port'=>11214],
['host'=>'localhost','port'=>11215],
];
private static $nodeArr=[];//服务器节点数组
public static $vnodeArr=[];//虚拟节点数组
public static $mObj;//单例对象
private function __construct()
{
}
private function __clone()
{
}
//进行节点的计算和虚拟节点的添加
private static function setVNode(){
foreach(self::$serArr as $k=>$v){
//给真实节点编号
$node = sprintf('%u',crc32(implode('-',$v)));
$key = implode('-',$v);
self::$nodeArr[$key] = $node;
//虚拟节点编号 一个真实节点添加100个虚拟节点
for($i=0;$i<100;$i++){
$vnode = sprintf('%u',crc32(implode('-',$v).'*'.$i));
$vkey = implode('-',$v).'*'.$i;
self::$vnodeArr[$vkey] = $vnode;
}
}
asort(self::$vnodeArr,SORT_NUMERIC);
}
//初始化方法
private static function mObj($key){
self::setVNode();
$ser = self::getSer($key);
if(!is_object(self::$mObj)){
self::$mObj = new \Memcache();
}
self::$mObj->pconnect($ser[0],$ser[1],5);
}
//根据key值得到该key应该存在哪个真实服务器节点
private static function getSer($key){
$knode = sprintf('%u',crc32($key));
reset(self::$vnodeArr);
$vnode = key(self::$vnodeArr);
foreach(self::$vnodeArr as $k=>$v){
if($knode<=$v){
$vnode = $k; //所属虚拟节点
break;
}
}
$nodeKey = explode('*',$vnode);
return explode('-',$nodeKey[0]);
}
//添加数据方法
public static function set($key,$value,$timestamp=0){
self::mObj($key);
$res = self::$mObj->set($key,$value,0,$timestamp);
return $res;
}
//获取数据方法
public static function get($key){
self::mObj($key);
$res = self::$mObj->get($key);
return $res;
}
//获取数据的命中率
public static function getAllSerStats(){
$bj = new \Memcache();
$hits = 0;
$misses = 0;
foreach(self::$serArr as $k=>$v){
$bj->connect($v['host'],$v['port']);
$res = $bj->getStats();
$hits += $res['get_hits'];
$misses += $res['get_misses'];
}
return ['hits'=>$hits,'misses'=>$misses];
}
}