1. 程式人生 > >把習慣當成一種生活

把習慣當成一種生活

說起快取,其實就是在說雜湊,快取其實就是用雜湊表臨時儲存中間結果,加上雜湊O(1)的複雜度本身固有的特性,可以為我們的系統大大節省耗時。

雜湊分為多種,不同的方式計算效能和碰撞率不同。最常規的方式,就是hash取模,最低階裝備,滿足不了分散式快取的需要。隨著系統訪問量增加,快取系統不得不通過增加機器節點的方式提高叢集的相應速度和資料承載量,一旦增加機器節點,快取資料需要重新建立,甚至是進行整體的快取資料遷移,工作量和風險都會增加。分散式快取,主要面臨下面兩個問題:

  1. n個節點中有一個宕掉了,或者需要新增機器,怎樣做到cache的遷移做到最少,降低cache無法命中的概率。
  2. 叢集中節點的硬體處理效能有高有低,想讓效能高的節點多被分配一些Job,保證叢集負載均衡。

那怎樣的分散式快取系統能夠最大限度的解決上面的問題呢?

隨之而來的一致性雜湊演算法就是專門來解決這個問題的。我們直接來看一下Consistent Hashing(1997年Consistenthashing and random trees)這種改良型的一致性雜湊裝備是怎麼產生的。

一致性雜湊演算法其實也是採用取模的方法,只不過不是對機器取模,而是對2^32取模。那為什麼要講Consistent Hashing呢,因為這套裝備最大限度地降低cache無法命中的概率,並在伺服器數量比較少的時候通過增加虛擬節點取得比較好的負載均衡的效果。

首先講為什麼對2的32次方 取模,因為機器IP為32位,這樣使用IP雜湊計算後的結果肯定處於0~ 2的32-1之間。將這個區間比作一個圓環,圓環上有2的32次方個點,則叢集上的機器一定散落在這些點上。同樣我們也將我們要快取的資料取md5值後同樣對2的32次方取模,將其對映到這個圓環上,放心2^32有43億大小,對於一般的快取系統來說這個量級也是足夠的。從快取資料的位置逆時針找到第一個機器就是該資料的快取物理機器,以後直接取這臺機器查詢資料即可。先在這闡明一點,一致性雜湊採用

TreeMap作為資料結構。

這裡引用一篇文章能更好的解釋Consistent Hashing演算法。

假設你已經通過上面這篇文章理解了Consistent Hashing這種利器,同時附一篇該利器的程式碼實現

另外延伸另外一種hash演算法-MurmurHash。該演算法已經應用到Redis,Memcached,Cassandra,HBase,Lucene等開源專案中,速度快,而且碰撞率低。以後可以儘量應用該演算法來解決雜湊問題。