最近在看一些分布式方面的文章,所以就用php實現一致性hash來練練手,以前一般用的是最原始的hash取模做 分布式,當生產過程中新增或刪除一台memcache都會造成資料的全部失效,一致性hash就是為了解決這個問題,把失效資料降到最低,相關資料可以 google一下!
php實現效率有一定的缺失,如果要高效率,還是寫擴充套件比較好
經測試,5個memcache,每個memcache生成100個虛擬節點,set加get1000次,與單個memcache直接set加get慢5倍,所以效率一般,有待優化!
在閱讀本文之前,最好知道二分查詢法。
實現過程:
memcache的配置 ip+埠+虛擬節點序列號 做hash,使用的是crc32,形成乙個閉環。
對要操作的key進行crc32
二分法在虛擬節點環中查詢最近的乙個虛擬節點
從虛擬節點中提取真實的memcache ip和埠,做單例連線
<?php
/**
* memcache一致性hash的php實現方法
* @author
* @date 2015-04-19
*/class memcachehashmap
}ksort($this->_node);//建立出來的1000個虛擬節點按照鍵名從小到大排序
}//例項化該類
static public function getinstance()
return $memcacheobj;
}//根據傳來的鍵查詢到對應虛擬節點的位置
private function _connectmemcache($key)
var_dump($this->_node[$nodekey]);
list($config, $num) = explode('_', $this->_node[$nodekey]);
if (!$config) throw new exception('cache config error');
if (!isset($this->_memcache[$config]))
return $this->_memcache[$config];
}//二分法根據給出的值找出最近的虛擬節點位置
private function _findservernode($m = 0, $b = 0)
if (abs($this->_nodedata[$b] - $this->_keynode) < abs($this->_nodedata[$m] - $this->_keynode)) return $this->_nodedata[$b];
else return $this->_nodedata[$m];
}public function set($key, $value, $expire = 0)
public function add($key, $value, $expire = 0)
public function get($key)
public function delete($key)
}$rundata['begin_time'] = microtime(true);
//測試一萬次set加get
for($i=0;$i<10000;$i++)
var_dump(number_format(microtime(true) - $rundata['begin_time'],6));
$rundata['begin_time'] = microtime(true); $m= new memcache;
$m->connect('127.0.0.1', 11211);
for($i=0;$i<10000;$i++)
var_dump(number_format(microtime(true) - $rundata['begin_time'],6));
?>
memcache的一致性hash演算法
此文是在網上看到別人寫memcache一致性hashi演算法後進行編寫的,感覺寫的很好,所以就再錄過來 現在一般的演算法就是乙個hash值演算法,對伺服器個數進行取餘來進行hash值的計算,假如你有n個cache,那麼對於object的對映,你會通過hash object n來進行對映對應的伺服器上...
一致性hash演算法在memcache集群中的應用
memcache是乙個分布式的快取系統,但是本身沒有提供集群功能,在大型應用的情況下容易成為瓶頸。在設計分布式memcache系統的時候,我們需要讓key的分布均衡,並且在增加cache server後,cache的遷移做到最少。常規的方式比如hash取模的方式,以hash k mod n的演算法來...
一致性hash演算法 面試必備 一致性hash演算法
最近公司在招人,我們準備的問題中有一道是關於一致性hash演算法的問題,只有一些面試者能夠回答上來,而且答的也不是很全面,有的面試者只是聽說過,有的連聽都沒聽過,下面我把一致性hash演算法整理一下分享給大家 一致性雜湊演算法在1997年由麻省理工學院的karger等人在解決分布式cache中提出的...