爲何要使用一致性hash?html
一致性hash主要應用於分佈式、負載均衡等。node
例如:你有 N 個 cache 服務器,那麼如何將一個對象object 映射到 N 個 cache 上呢,你極可能會採用取模(key%N)的方法計算 object 的 hash 值,而後均勻的映射到到 N 個 cache服務器。當一個服務器掛了或者增長了一個,那麼獲得的hash值=key%(N-1)(或者key%(N+1)),形成的後果就是全部的緩存都失效了,這不是咱們想看到的。緩存
此時就要考慮一致性hash了。服務器
一致性hash的實現負載均衡
一、首先計算出每一個節點的hash值,並將其配置到0~(2的32次方)的圓(continuum)上。分佈式
二、用一樣的hash函數計算出存儲數據的hash值,並映射到相同的圓上。memcached
三、而後從數據映射到的位置開始順時針查找,將數據保存到找到的第一個節點上。若是超過(2的32次方)仍然找不到服務器,就會保存到第一臺memcached服務器上函數
若是增長一個節點,觀察下影響範圍htm
由圖能夠看出,影響範圍縮小至node2和node5之間的數據對象