memcache一致性hash的php實現方法

2021-07-01 22:36:22 字數 1965 閱讀 3800

最近在看一些分布式方面的文章,所以就用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中提出的...