memcache是乙個分布式的快取系統,但是本身沒有提供集群功能,在大型應用的情況下容易成為瓶頸。
在設計分布式memcache系統的時候,我們需要讓key的分布均衡,並且在增加cache server後,cache的遷移做到最少。
常規的方式比如hash取模的方式,以hash(k) mod n的演算法來操作對應的機器,這種結構簡單實用,但是在一些高速發展的web系統中,這樣的解決方案存在著巨大的缺陷。比如其中一台伺服器掛了,或者需要增加一台服務的時候,大量的快取命不中,快取資料需要重新建立,甚至是進行整體的快取資料遷移,瞬間會給db帶來極高的系統負載,甚至導致db伺服器宕機。
使用一致性hash演算法能夠當乙個節點失效的時候,其他節點的資料不會受到破壞,這個節點的資料會被分流到另外乙個節點。當增加乙個節點時,只會對乙個節點的一分部資料有影響,能夠滿足大型memcache集群架構的要求。
一致性雜湊演算法的演算法原理在這裡就不累述,下面說一下在php應用中使用一致性hash演算法實現memcache集群的方法。在php中有三種選擇分別是原生的memcache擴充套件,memcached擴充套件,還有乙個是網上比較流行的flexihash類。
使用memcahe擴充套件時如果想應用一致性hash演算法
ini_set('memcache.hash_function','crc32');
ini_set('memcache.hash_strategy','consistent');
使用memcached擴充套件時如果想應用一致性hash演算法
$memcached = new memcached;
$memcached -> setoption(memcached::opt_hash, memcached::hash_crc);
$memcached -> setoption(memcached::opt_distribution, memcached::distribution_consistent);
<?phprequire_once 'flexihash.php';
class fmemcache
public function addservers( $servers )
$this->hash->addtargets( $targets );}
public function set( $key, $value )
if ($this->connectpool[$node])}}
return false;}
public function get( $key )
if ($this->connectpool[$node])}}
return false;}}
?>
一致性hash演算法 面試必備 一致性hash演算法
最近公司在招人,我們準備的問題中有一道是關於一致性hash演算法的問題,只有一些面試者能夠回答上來,而且答的也不是很全面,有的面試者只是聽說過,有的連聽都沒聽過,下面我把一致性hash演算法整理一下分享給大家 一致性雜湊演算法在1997年由麻省理工學院的karger等人在解決分布式cache中提出的...
一致性hash演算法虛擬節點 一致性hash演算法
hash 演算法也叫做雜湊演算法,他可以讓任意長度的資料m對映成為長度固定的值h。hash演算法的第乙個作用就是資料的快速儲存與查詢。寫過程式的人都知道,基本上主流的程式語言裡面都有個資料結構叫做map dictionary或者 hash table 它是根據key來直接訪問結果的資料結構。key的...
一致性hash演算法
july部落格16章開始 第一題 全排列,輸入乙個字串,列印出該字串中字元的所有排列 1.個人思路 回溯法建立的排序樹 2.july部落格 遞迴實現,依次固定第乙個字母,後面的交換,和上面描述的使用回溯法相似 c stl 演算法 next permutation的思想,關於next permutat...