<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          圖解一致性哈希算法,看這一篇就夠了!

          共 9504字,需瀏覽 20分鐘

           ·

          2022-11-22 19:09

          近段時(shí)間一直在總結(jié)分布式系統(tǒng)架構(gòu)常見(jiàn)的算法。前面我們介紹過(guò)布隆過(guò)濾器算法。接下來(lái)介紹一個(gè)非常重要、也非常實(shí)用的算法:一致性哈希算法。通過(guò)介紹一致性哈希算法的原理并給出了一種實(shí)現(xiàn)和實(shí)際運(yùn)用的案例,帶大家真正理解一致性哈希算法。


          一、背景

          在具體介紹一致性哈希算法之前,先問(wèn)一個(gè)問(wèn)題:為什么需要一致性哈希算法?下面我們通過(guò)一個(gè)案例來(lái)回答這個(gè)問(wèn)題。

          假設(shè)有這么一種場(chǎng)景:我們有三臺(tái)緩存服務(wù)器分別為:node0、node1、node2,有3000萬(wàn)個(gè)緩存數(shù)據(jù)需要存儲(chǔ)在這三臺(tái)服務(wù)器組成的集群中,希望可以將這些數(shù)據(jù)均勻的緩存到三臺(tái)機(jī)器上,你會(huì)想到什么方案呢?

          我們可能首先想到的方案是:取模算法hash(key)%N,即:對(duì)緩存數(shù)據(jù)的key進(jìn)行hash運(yùn)算后取模,N是機(jī)器的數(shù)量;運(yùn)算后的結(jié)果映射對(duì)應(yīng)集群中的節(jié)點(diǎn)。具體如下圖所示:

          如上圖所示,首先對(duì)key進(jìn)行hash計(jì)算后的結(jié)果對(duì)3取模,得到的結(jié)果一定是0、1或者2;然后映射對(duì)應(yīng)的服務(wù)器node0、node1、node2,最后直接找對(duì)應(yīng)的服務(wù)器存取數(shù)據(jù)即可。


          通過(guò)取模算法將每個(gè)數(shù)據(jù)請(qǐng)求都均勻的分散到了三個(gè)不同的服務(wù)器節(jié)點(diǎn)上,看起來(lái)很完美!但是,在分布式集群系統(tǒng)的負(fù)載均衡實(shí)現(xiàn)上,這種模型在集群擴(kuò)容和收縮時(shí)卻有一定的局限性:因?yàn)樵谏a(chǎn)環(huán)境中根據(jù)業(yè)務(wù)量的大小,調(diào)整服務(wù)器數(shù)量是常有的事,而服務(wù)器數(shù)量N發(fā)生變化后hash(key)%N計(jì)算的結(jié)果也會(huì)隨之變化!導(dǎo)致整個(gè)集群的緩存數(shù)據(jù)必須重新計(jì)算調(diào)整,進(jìn)而導(dǎo)致大量緩存在同一時(shí)間失效,造成緩存的雪崩,最終導(dǎo)致整個(gè)緩存系統(tǒng)的不可用,這是不能接受的。為了解決優(yōu)化上述情況,一致性哈希算法應(yīng)運(yùn)而生。


          二、一致性哈希簡(jiǎn)介

          有些朋友一聽(tīng)到算法就頭大,其實(shí)大可不必,一致性哈希算法聽(tīng)起來(lái)高大上,其實(shí)非常簡(jiǎn)單。接下來(lái)開始介紹什么是一致性哈希算法,它解決了什么問(wèn)題。

          2.1 什么是一致性哈希?

          一致性哈希(Consistent Hash)算法是1997年提出,是一種特殊的哈希算法,目的是解決分布式系統(tǒng)的數(shù)據(jù)分區(qū)問(wèn)題:當(dāng)分布式集群移除或者添加一個(gè)服務(wù)器時(shí),必須盡可能小地改變已存在的服務(wù)請(qǐng)求與處理請(qǐng)求服務(wù)器之間的映射關(guān)系。


          2.2 一致性哈希主要解決問(wèn)題

          我們知道,傳統(tǒng)的按服務(wù)器節(jié)點(diǎn)數(shù)量取模在集群擴(kuò)容和收縮時(shí)存在一定的局限性。而一致性哈希算法正好解決了簡(jiǎn)單哈希算法在分布式集群中存在的動(dòng)態(tài)伸縮的問(wèn)題。降低節(jié)點(diǎn)上下線的過(guò)程中帶來(lái)的數(shù)據(jù)遷移成本,同時(shí)節(jié)點(diǎn)數(shù)量的變化與分片原則對(duì)于應(yīng)用系統(tǒng)來(lái)說(shuō)是無(wú)感的,使上層應(yīng)用更專注于領(lǐng)域內(nèi)邏輯的編寫,使得整個(gè)系統(tǒng)架構(gòu)能夠動(dòng)態(tài)伸縮,更加靈活方便。


          2.3 一致性哈希的使用場(chǎng)景

          一致性哈希算法是分布式系統(tǒng)中的重要算法,使用場(chǎng)景也非常廣泛。主要是是負(fù)載均衡、緩存數(shù)據(jù)分區(qū)等場(chǎng)景。

          一致性哈希應(yīng)該是實(shí)現(xiàn)負(fù)載均衡的首選算法,它的實(shí)現(xiàn)比較靈活,既可以在客戶端實(shí)現(xiàn),也可以在中間件上實(shí)現(xiàn),比如日常使用較多的緩存中間件memcached 使用的路由算法用的就是一致性哈希算法。

          此外,其它的應(yīng)用場(chǎng)景還有很多:

          • RPC框架Dubbo用來(lái)選擇服務(wù)提供者

          • 分布式關(guān)系數(shù)據(jù)庫(kù)分庫(kù)分表:數(shù)據(jù)與節(jié)點(diǎn)的映射關(guān)系

          • LVS負(fù)載均衡調(diào)度器


          三、一致性哈希的原理

          2.1 算法原理

          前面介紹的取模算法雖然使用簡(jiǎn)單,但缺陷也很明顯,如果服務(wù)器中保存有服務(wù)請(qǐng)求對(duì)應(yīng)的數(shù)據(jù),那么如果重新計(jì)算請(qǐng)求的哈希值,會(huì)造成緩存的雪崩的問(wèn)題。這種情況在分布式系統(tǒng)中是非常糟糕的。一個(gè)設(shè)計(jì)良好的分布式系統(tǒng)應(yīng)該具有良好的單調(diào)性,即服務(wù)器的添加與移除不會(huì)造成大量的哈希重定位,而一致性哈希恰好可以解決這個(gè)問(wèn)題 。


          其實(shí),一致性哈希算法本質(zhì)上也是一種取模算法。只不過(guò)前面介紹的取模算法是按服務(wù)器數(shù)量取模,而一致性哈希算法是對(duì)固定值2^32取模,這就使得一致性算法具備良好的單調(diào)性:不管集群中有多少個(gè)節(jié)點(diǎn),只要key值固定,那所請(qǐng)求的服務(wù)器節(jié)點(diǎn)也同樣是固定的。其算法的工作原理如下:

          1. 一致性哈希算法將整個(gè)哈希值空間映射成一個(gè)虛擬的圓環(huán),整個(gè)哈希空間的取值范圍為0~2^32-1;

          2. 計(jì)算各服務(wù)器節(jié)點(diǎn)的哈希值,并映射到哈希環(huán)上;

          3. 將服務(wù)發(fā)來(lái)的數(shù)據(jù)請(qǐng)求使用哈希算法算出對(duì)應(yīng)的哈希值;

          4. 將計(jì)算的哈希值映射到哈希環(huán)上,同時(shí)沿圓環(huán)順時(shí)針?lè)较虿檎遥龅降牡谝慌_(tái)服務(wù)器就是所對(duì)應(yīng)的處理請(qǐng)求服務(wù)器。

          5. 當(dāng)增加或者刪除一臺(tái)服務(wù)器時(shí),受影響的數(shù)據(jù)僅僅是新添加或刪除的服務(wù)器到其環(huán)空間中前一臺(tái)的服務(wù)器(也就是順著逆時(shí)針?lè)较蛴龅降牡谝慌_(tái)服務(wù)器)之間的數(shù)據(jù),其他都不會(huì)受到影響。


          綜上所述,一致性哈希算法對(duì)于節(jié)點(diǎn)的增減都只需重定位環(huán)空間中的一小部分?jǐn)?shù)據(jù),具有較好的容錯(cuò)性和可擴(kuò)展性 。


          2.2 深入剖析

          說(shuō)了那么多,可能你還是云里霧里的,那么接下來(lái)我們?cè)敿?xì)剖析一致性哈希的實(shí)現(xiàn)原理。

          2.2.1 哈希環(huán)

          首先,一致性哈希算法將整個(gè)哈希值空間映射成一個(gè)虛擬的圓環(huán)。整個(gè)哈希空間的取值范圍為0~2^32-1,按順時(shí)針?lè)较蜷_始從0~2^32-1排列,最后的節(jié)點(diǎn)2^32-1在0開始位置重合,形成一個(gè)虛擬的圓環(huán)。如下圖所示:

          2.2.2 服務(wù)器映射到哈希環(huán)

          接下來(lái),將服務(wù)器節(jié)點(diǎn)映射到哈希環(huán)上對(duì)應(yīng)的位置。我們可以對(duì)服務(wù)器IP地址進(jìn)行哈希計(jì)算,哈希計(jì)算后的結(jié)果對(duì)2^32取模,結(jié)果一定是一個(gè)0到2^32-1之間的整數(shù)。最后將這個(gè)整數(shù)映射在哈希環(huán)上,整數(shù)的值就代表了一個(gè)服務(wù)器節(jié)點(diǎn)的在哈希環(huán)上的位置。即:hash(服務(wù)器ip)% 2^32。下面我們依次將node0、node1、node2三個(gè)緩存服務(wù)器映射到哈希環(huán)上,如下圖所示:


          2.2.3 對(duì)象key映射到服務(wù)器

          當(dāng)服務(wù)器接收到數(shù)據(jù)請(qǐng)求時(shí),首先需要計(jì)算請(qǐng)求Key的哈希值;然后將計(jì)算的哈希值映射到哈希環(huán)上的具體位置;接下來(lái),從這個(gè)位置沿著哈希環(huán)順時(shí)針查找,遇到的第一個(gè)節(jié)點(diǎn)就是key對(duì)應(yīng)的節(jié)點(diǎn);最后,將請(qǐng)求發(fā)送到具體的服務(wù)器節(jié)點(diǎn)執(zhí)行數(shù)據(jù)操作。

          假設(shè)我們有“key-01:張三”、“key-02:李四”、“key-03:王五”三條緩存數(shù)據(jù)。經(jīng)過(guò)哈希算法計(jì)算后,映射到哈希環(huán)上的位置如下圖所示:

          如上圖所示,通過(guò)哈希計(jì)算后,key-01順時(shí)針尋找將找到node0,key-02順時(shí)針尋找將找到node1,key-03順時(shí)針尋找將找到node2。最后,請(qǐng)求找到的服務(wù)器節(jié)點(diǎn)執(zhí)行具體的業(yè)務(wù)操作。


          以上便是一致性哈希算法的工作原理。



          四、服務(wù)器擴(kuò)容&縮容

          前面介紹了一致性哈希算法的工作原理,那么,一致性哈希算法如何避免服務(wù)器動(dòng)態(tài)伸縮的問(wèn)題的呢?

          4.1 服務(wù)器縮容

          服務(wù)器縮容就是減少集群中服務(wù)器節(jié)點(diǎn)的數(shù)量或是集群中某個(gè)節(jié)點(diǎn)故障。假設(shè),集群中的某個(gè)節(jié)點(diǎn)故障,原本映射到該節(jié)點(diǎn)的請(qǐng)求,會(huì)找到哈希環(huán)中的下一個(gè)節(jié)點(diǎn),數(shù)據(jù)也同樣被重新分配至下一個(gè)節(jié)點(diǎn),其它節(jié)點(diǎn)的數(shù)據(jù)和請(qǐng)求不受任何影響。這樣就確保節(jié)點(diǎn)發(fā)生故障時(shí),集群能保持正常穩(wěn)定。如下圖所示:

          如上圖所示:節(jié)點(diǎn)node2發(fā)生故障時(shí),數(shù)據(jù)key-01和key-02不會(huì)受到影響,只有key-03的請(qǐng)求被重定位到node0。在一致性哈希算法中,如果某個(gè)節(jié)點(diǎn)宕機(jī)不可用了,那么受影響的數(shù)據(jù)僅僅是會(huì)尋址到此節(jié)點(diǎn)和前一節(jié)點(diǎn)之間的數(shù)據(jù)。其他哈希環(huán)上的數(shù)據(jù)不會(huì)受到影響。


          4.2 服務(wù)器擴(kuò)容

          服務(wù)器擴(kuò)容就是集群中需要增加一個(gè)新的數(shù)據(jù)節(jié)點(diǎn),假設(shè),由于需要緩存的數(shù)據(jù)量太大,必須對(duì)集群進(jìn)行擴(kuò)容增加一個(gè)新的數(shù)據(jù)節(jié)點(diǎn)。此時(shí),只需要計(jì)算新節(jié)點(diǎn)的哈希值并將新的節(jié)點(diǎn)加入到哈希環(huán)中,然后將哈希環(huán)中從上一個(gè)節(jié)點(diǎn)到新節(jié)點(diǎn)的數(shù)據(jù)映射到新的數(shù)據(jù)節(jié)點(diǎn)即可。其他節(jié)點(diǎn)數(shù)據(jù)不受影響,具體如下圖所示:

          如上圖所示,加入新的node3節(jié)點(diǎn)后,key-01、key-02不受影響,只有key-03的尋址被重定位到新節(jié)點(diǎn)node3,受影響的數(shù)據(jù)僅僅是會(huì)尋址到新節(jié)點(diǎn)和前一節(jié)點(diǎn)之間的數(shù)據(jù)。


          通過(guò)一致性哈希算法,集群擴(kuò)容或縮容時(shí),只需要重新定位哈希環(huán)空間內(nèi)的一小部分?jǐn)?shù)據(jù)。其他數(shù)據(jù)保持不變。當(dāng)節(jié)點(diǎn)數(shù)越多的時(shí)候,使用哈希算法時(shí),需要遷移的數(shù)據(jù)就越多,使用一致哈希時(shí),需要遷移的數(shù)據(jù)就越少。所以,一致哈希算法具有較好的容錯(cuò)性和可擴(kuò)展性。


          五、數(shù)據(jù)傾斜與虛擬節(jié)點(diǎn)

          5.1 什么是數(shù)據(jù)傾斜?

          前面說(shuō)了一致性哈希算法的原理以及擴(kuò)容縮容的問(wèn)題。但是,由于哈希計(jì)算的隨機(jī)性,導(dǎo)致一致性哈希算法存在一個(gè)致命問(wèn)題:數(shù)據(jù)傾斜,,也就是說(shuō)大多數(shù)訪問(wèn)請(qǐng)求都會(huì)集中少量幾個(gè)節(jié)點(diǎn)的情況。特別是節(jié)點(diǎn)太少情況下,容易因?yàn)楣?jié)點(diǎn)分布不均勻造成數(shù)據(jù)訪問(wèn)的冷熱不均。這就失去了集群和負(fù)載均衡的意義。如下圖所示:

          如上圖所示,key-1、key-2、key-3可能被映射到同一個(gè)節(jié)點(diǎn)node0上。導(dǎo)致node0負(fù)載過(guò)大,而node1和node2卻很空閑的情況。這有可能導(dǎo)致個(gè)別服務(wù)器數(shù)據(jù)和請(qǐng)求壓力過(guò)大和崩潰,進(jìn)而引起集群的崩潰。


          5.2 如何解決數(shù)據(jù)傾斜?

          為了解決數(shù)據(jù)傾斜的問(wèn)題,一致性哈希算法引入了虛擬節(jié)點(diǎn)機(jī)制,即對(duì)每一個(gè)物理服務(wù)節(jié)點(diǎn)映射多個(gè)虛擬節(jié)點(diǎn),將這些虛擬節(jié)點(diǎn)計(jì)算哈希值并映射到哈希環(huán)上,當(dāng)請(qǐng)求找到某個(gè)虛擬節(jié)點(diǎn)后,將被重新映射到具體的物理節(jié)點(diǎn)。虛擬節(jié)點(diǎn)越多,哈希環(huán)上的節(jié)點(diǎn)就越多,數(shù)據(jù)分布就越均勻,從而避免了數(shù)據(jù)傾斜的問(wèn)題。


          說(shuō)起來(lái)可能比較復(fù)雜,一句話概括起來(lái)就是:原有的節(jié)點(diǎn)、數(shù)據(jù)定位的哈希算法不變,只是多了一步虛擬節(jié)點(diǎn)到實(shí)際節(jié)點(diǎn)的映射。具體如下圖所示:

          如上圖所示,我們可以在服務(wù)器ip或主機(jī)名的后面增加編號(hào)來(lái)實(shí)現(xiàn),將全部的虛擬節(jié)點(diǎn)加入到哈希環(huán)中,增加了節(jié)點(diǎn)后,數(shù)據(jù)在哈希環(huán)上的分布就相對(duì)均勻了。當(dāng)有訪問(wèn)請(qǐng)求尋址到node0-1這個(gè)虛擬節(jié)點(diǎn)時(shí),將被重新映射到物理節(jié)點(diǎn)node0。


          六、一致性Hash算法實(shí)現(xiàn)

          前面介紹了一致性哈希算法的原理、動(dòng)態(tài)伸縮以及數(shù)據(jù)傾斜的問(wèn)題后,下面我們根據(jù)上面的講述,使用Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的一致性哈希算法。

          6.1 數(shù)據(jù)節(jié)點(diǎn)

          首先定義一個(gè)節(jié)點(diǎn)類,實(shí)現(xiàn)數(shù)據(jù)節(jié)點(diǎn)的功能,具體代碼如下:

          public class Node {    private static final int VIRTUAL_NODE_NO_PER_NODE = 200;    private final String ip;    private final List<Integer> virtualNodeHashes = new ArrayList<>(VIRTUAL_NODE_NO_PER_NODE);    private final Map<Object, Object> cacheMap = new HashMap<>();
          public Node(String ip) { Objects.requireNonNull(ip); this.ip = ip; initVirtualNodes(); }

          private void initVirtualNodes() { String virtualNodeKey; for (int i = 1; i <= VIRTUAL_NODE_NO_PER_NODE; i++) { virtualNodeKey = ip + "#" + i; virtualNodeHashes.add(HashUtils.hashcode(virtualNodeKey)); } }
          public void addCacheItem(Object key, Object value) { cacheMap.put(key, value); }

          public Object getCacheItem(Object key) { return cacheMap.get(key); }

          public void removeCacheItem(Object key) { cacheMap.remove(key); }

          public List<Integer> getVirtualNodeHashes() { return virtualNodeHashes; }
          public String getIp() { return ip; }}


          6.2 實(shí)現(xiàn)一致性哈希算法

          接下來(lái)實(shí)現(xiàn)核心功能:一致性哈希算法,主要使用java的TreeMap類,實(shí)現(xiàn)哈希環(huán)和哈希查找的功能。具體代碼如下所示:

          public class ConsistentHash {    private final TreeMap<Integer, Node> hashRing = new TreeMap<>();
          public List<Node> nodeList = new ArrayList<>();
          /** * 增加節(jié)點(diǎn) * 每增加一個(gè)節(jié)點(diǎn),就會(huì)在閉環(huán)上增加給定虛擬節(jié)點(diǎn) * 例如虛擬節(jié)點(diǎn)數(shù)是2,則每調(diào)用此方法一次,增加兩個(gè)虛擬節(jié)點(diǎn),這兩個(gè)節(jié)點(diǎn)指向同一Node * @param ip */ public void addNode(String ip) { Objects.requireNonNull(ip); Node node = new Node(ip); nodeList.add(node); for (Integer virtualNodeHash : node.getVirtualNodeHashes()) { hashRing.put(virtualNodeHash, node); System.out.println("虛擬節(jié)點(diǎn)[" + node + "] hash:" + virtualNodeHash + ",被添加"); } }
          /** * 移除節(jié)點(diǎn) * @param node */ public void removeNode(Node node){ nodeList.remove(node); }
          /** * 獲取緩存數(shù)據(jù) * 先找到對(duì)應(yīng)的虛擬節(jié)點(diǎn),然后映射到物理節(jié)點(diǎn) * @param key * @return */ public Object get(Object key) { Node node = findMatchNode(key); System.out.println("獲取到節(jié)點(diǎn):" + node.getIp()); return node.getCacheItem(key); }
          /** * 添加緩存 * 先找到hash環(huán)上的節(jié)點(diǎn),然后在對(duì)應(yīng)的節(jié)點(diǎn)上添加數(shù)據(jù)緩存 * @param key * @param value */ public void put(Object key, Object value) { Node node = findMatchNode(key);
          node.addCacheItem(key, value); }
          /** * 刪除緩存數(shù)據(jù) */ public void evict(Object key) { findMatchNode(key).removeCacheItem(key); }

          /** * 獲得一個(gè)最近的順時(shí)針節(jié)點(diǎn) * @param key 為給定鍵取Hash,取得順時(shí)針?lè)较蛏献罱囊粋€(gè)虛擬節(jié)點(diǎn)對(duì)應(yīng)的實(shí)際節(jié)點(diǎn) * * @return 節(jié)點(diǎn)對(duì)象 * @return */ private Node findMatchNode(Object key) { Map.Entry<Integer, Node> entry = hashRing.ceilingEntry(HashUtils.hashcode(key)); if (entry == null) { entry = hashRing.firstEntry(); } return entry.getValue(); }}

          如上所示,通過(guò)TreeMap的ceilingEntry() 方法,實(shí)現(xiàn)順時(shí)針查找下一個(gè)的服務(wù)器節(jié)點(diǎn)的功能。


          6.3 哈希計(jì)算方法

          哈希計(jì)算方法比較常見(jiàn),網(wǎng)上也有很多計(jì)算hash 值的函數(shù)。示例代碼如下:

          public class HashUtils {
          /** * FNV1_32_HASH * * @param obj * object * @return hashcode */ public static int hashcode(Object obj) { final int p = 16777619; int hash = (int) 2166136261L; String str = obj.toString(); for (int i = 0; i < str.length(); i++) hash = (hash ^ str.charAt(i)) * p; hash += hash << 13; hash ^= hash >> 7; hash += hash << 3; hash ^= hash >> 17; hash += hash << 5;
          if (hash < 0) hash = Math.abs(hash); //System.out.println("hash computer:" + hash); return hash; }}


          6.4 驗(yàn)證測(cè)試

          一致性哈希算法實(shí)現(xiàn)后,接下來(lái)添加一個(gè)測(cè)試類,驗(yàn)證此算法時(shí)候正常。示例代碼如下:

          public class ConsistentHashTest {    public static final int NODE_SIZE = 10;    public static final int STRING_COUNT = 100 * 100;    private static ConsistentHash consistentHash = new ConsistentHash();    private static List<String> sList = new ArrayList<>();
          public static void main(String[] args) { // 增加節(jié)點(diǎn) for (int i = 0; i < NODE_SIZE; i++) { String ip = new StringBuilder("10.2.1.").append(i) .toString(); consistentHash.addNode(ip); }
          // 生成需要緩存的數(shù)據(jù); for (int i = 0; i < STRING_COUNT; i++) { sList.add(RandomStringUtils.randomAlphanumeric(10)); }
          // 將數(shù)據(jù)放入到緩存中。 for (String s : sList) { consistentHash.put(s, s); }
          for(int i = 0 ; i < 10 ; i ++) { int index = RandomUtils.nextInt(0, STRING_COUNT); String key = sList.get(index); String cache = (String) consistentHash.get(key); System.out.println("Random:"+index+",key:" + key + ",consistentHash get value:" + cache +",value is:" + key.equals(cache)); }
          // 輸出節(jié)點(diǎn)及數(shù)據(jù)分布情況 for (Node node : consistentHash.nodeList){ System.out.println(node); }
          // 新增一個(gè)數(shù)據(jù)節(jié)點(diǎn) consistentHash.addNode("10.2.1.110"); for(int i = 0 ; i < 10 ; i ++) { int index = RandomUtils.nextInt(0, STRING_COUNT); String key = sList.get(index); String cache = (String) consistentHash.get(key); System.out.println("Random:"+index+",key:" + key + ",consistentHash get value:" + cache +",value is:" + key.equals(cache)); }
          // 輸出節(jié)點(diǎn)及數(shù)據(jù)分布情況 for (Node node : consistentHash.nodeList){ System.out.println(node); } }}

          運(yùn)行此測(cè)試,輸出結(jié)果如下所示:


          最后

          以上,我們就把一致性哈希算法的實(shí)現(xiàn)原理,應(yīng)用場(chǎng)景、解決了哪些問(wèn)題都介紹完了,并用java簡(jiǎn)單實(shí)現(xiàn)了一個(gè)一致性哈希算法。相信看完之后,大家對(duì)一致性哈希算法應(yīng)該不會(huì)那么陌生害怕了吧。


          瀏覽 99
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人 免费视频A片视频88p | 大香蕉在线色 | 日逼观看视频 | 亚洲一区二区三区污污污 | 国产精品不卡一卡二卡三卡四卡 |