日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一致性hash 简单实现

發布時間:2025/3/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一致性hash 简单实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一致性hash 簡單實現 package com.jackiesteed.algorithms;import java.util.*;/*** 虛擬節點個數需要事先確定好, 而且不能修改.* 核心代碼模擬了一下remapping的邏輯, 如何做到均衡分配.* 如何保證一致性呢? 每次重新分配的時候, 只有被移動的虛擬節點才會收到影響, 保持了一致性.* 一致性hash 簡單實現, 單線程使用* key 固定為String, value 支持泛型* 感覺只是走了下流程, 離實際使用在性能, 并發方面還要改進.* Created by jackie on 5/24/15.*/ public class ConsistentHashMap <T>{/*** 存儲機器id對應的真實ip, 用來做遠程調用.*/private Map<String, Stack<Integer>> realNodeMap;/*** 虛擬節點到真實節點的映射* 虛擬節點數根據現實情況來權衡.* 節點數極大的話, 可以保證趨向于決定均勻分布, 但是remapping的時間開銷交大.* 節點數少, 壓力不一定非常均勻, 但是remapping速度回塊一些.* 但是虛擬節點數, 一定要是服務所需的機器數的N倍之多.*/private String[] virtualRealMap;/*** 用來模擬分布式系統里面的每臺機器* key 是ip, value mock機器里面的存儲, 是個java.util.Map*/private Map<String, Map<String, T>> hostMock;/*** 構造函數里面初始化虛擬節點個數.* @param virtualNodeCount*/public ConsistentHashMap(int virtualNodeCount){virtualRealMap = new String[virtualNodeCount];realNodeMap = new HashMap<String, Stack<Integer>>();hostMock = new HashMap<String, Map<String, T>>();}/*** 對外接口, 寫入數據到分布式存儲里面.* @param key* @param value*/public void put(String key, T value){put(getRealHashCode(key), key, value);}/*** 對外暴露的接口, 從分布式存儲提取數據.* @param key* @return*/public T get(String key){return get(getRealHashCode(key), key);}/*** 根據key計算需要映射的真是機器的id.* @param key* @return*/private String getRealHashCode(String key){//字符串原本的hash值int oriHashCode = key.hashCode();//key對應的虛擬節點的hash值int virtualHashCode = (oriHashCode % virtualRealMap.length + virtualRealMap.length) % virtualRealMap.length;//映射出來的真實String ip = virtualRealMap[virtualHashCode];return ip;}/*** 這個其實就是和真是的數據存儲進行交互了, ip用來訪問真實機器.* @param ip* @param key* @param value*/private void put(String ip, String key, T value){hostMock.get(ip).put(key, value);}/*** realHashCode表示對應機器的id, 從這臺機器上面獲取數據.* @param* @param key* @return*/private T get(String ip, String key){return hostMock.get(ip).get(key);}/*** 添加一臺機器.* @param ip*/public void addHost(String ip){/*** 如果已經存在了, 就不加入*/if(realNodeMap.containsKey(ip))return;hostMock.put(ip, new HashMap<String, T>());//目前還沒有機器加入, 那么需要走特殊的初始化流程if(realNodeMap.isEmpty()){Stack<Integer> virtualIds = new Stack<Integer>();for(int i = 0; i < virtualRealMap.length; i++){virtualRealMap[i] = ip;virtualIds.push(i);}realNodeMap.put(ip, virtualIds);return;}int expectCount = virtualRealMap.length / (realNodeMap.size() + 1);Stack<Integer> virtualIds = new Stack<Integer>();while(virtualIds.size() < expectCount){for(Map.Entry<String, Stack<Integer>> entry : realNodeMap.entrySet()){Stack<Integer> oldVirtualIds = entry.getValue();while(oldVirtualIds.size() > expectCount){int virtualId = oldVirtualIds.pop();virtualRealMap[virtualId] = ip;virtualIds.push(virtualId);}if(virtualIds.size() >= expectCount)break;}}realNodeMap.put(ip, virtualIds);}/*** 從分布式系統里刪除一臺機器* @param ip*/public void deleteHost(String ip){if(!realNodeMap.containsKey(ip))return;hostMock.remove(ip);Stack<Integer> virtualIds = realNodeMap.get(ip);int expectCount = virtualRealMap.length / (realNodeMap.size() - 1);realNodeMap.remove(ip);//說明這是最后一個ip, 沒有辦法把這個ip映射的虛擬節點重新映射了, 直接全部都刪掉.if(realNodeMap.isEmpty()){for(int i = 0; i < virtualRealMap.length; i++){virtualRealMap[i] = null;}return;}while(!virtualIds.isEmpty()){for(Map.Entry<String, Stack<Integer>> entry : realNodeMap.entrySet()){Stack<Integer> oldVirtualIds = entry.getValue();while(oldVirtualIds.size() < expectCount && !virtualIds.isEmpty()){int virtualId = virtualIds.pop();virtualRealMap[virtualId] = ip;oldVirtualIds.push(virtualId);}if(virtualIds.isEmpty())break;}//如果不增加, 有可能永遠分配不出去.expectCount++;}}public void dump(){System.out.println("=====================================================");System.out.println("VirtualNodeCount : " + virtualRealMap.length);for(Map.Entry<String, Stack<Integer>> entry : realNodeMap.entrySet()){System.out.print(entry.getKey() + " : | ");for(Integer virtualId : entry.getValue()){System.out.format("%2d | ", virtualId);}System.out.println();}System.out.println("=====================================================");}public static void main(String[] args){ConsistentHashMap<String> consistentHashMap = new ConsistentHashMap<String>(30);consistentHashMap.addHost("192.168.0.1");consistentHashMap.addHost("192.168.0.2");consistentHashMap.addHost("192.168.0.4");consistentHashMap.addHost("192.168.0.3");consistentHashMap.addHost("192.168.0.8");consistentHashMap.addHost("192.168.0.13");consistentHashMap.addHost("192.168.0.14");consistentHashMap.deleteHost("192.168.0.4");consistentHashMap.deleteHost("192.168.0.1");consistentHashMap.deleteHost("192.168.0.2");consistentHashMap.addHost("123.123.123.123");consistentHashMap.addHost("123.123.123.124");consistentHashMap.addHost("123.123.123.125");consistentHashMap.dump();consistentHashMap.put("jackie", "abc");System.out.println(consistentHashMap.get("jackie"));} }

?

posted on 2015-05-24 23:47?Jackiesteed 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/jackiesteed/articles/4526848.html

總結

以上是生活随笔為你收集整理的一致性hash 简单实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 午夜免费高清视频 | 欧美毛茸茸 | 亚洲成人av片 | 色眯眯影视 | 一级aa毛片 | 国产福利观看 | 美女视频一区二区三区 | 欧美 日韩 高清 | 免费在线观看a级片 | 无码人妻精品一区二区三区在线 | 人人妻人人做人人爽 | 午夜影院a | 国产精品无码一区二区三区免费 | 自拍偷拍999 | 97超在线| 日韩精品一区二区三区久久 | 欧美 日韩 精品 | 欧美性猛交xxxx乱大交蜜桃 | 国产资源一区 | 五月婷婷开心中文字幕 | 综合视频一区二区 | 国产乱淫av麻豆国产免费 | 午夜激情一区 | 操批网站 | 亚洲av无码国产精品麻豆天美 | 97视频免费 | 日韩久久不卡 | 95看片淫黄大片一级 | 久久久久久www | 亚洲一级片免费 | 欧美精品欧美精品系列 | av在线精品| 亚洲不卡视频在线 | 精品免费av | 久久精品视频在线播放 | 99精品视频免费看 | 国产福利一区在线 | 欧美乱强伦 | 女人一级一片30分 | 国产蜜臀在线 | 日韩视频免费观看 | 久久久久亚洲av成人人电影 | 日韩影院一区 | 国产精品免费一区二区区 | 九九视频免费看 | 大尺度做爰床戏呻吟舒畅 | 你懂的视频网站 | 秘密爱大尺度做爰呻吟 | 五月天婷婷在线观看 | 九色丨蝌蚪丨成人 | 成人18视频 | 91你懂的| 免费人成在线观看网站 | 精品黄色在线观看 | 国产在线播放网站 | 精品国产成人av | 欧美日韩女优 | xxx在线视频| 国产午夜无码视频在线观看 | 小泽玛利亚一区二区三区在线观看 | 日本精品入口免费视频 | 黑人精品欧美一区二区蜜桃 | 欧美日韩免费在线视频 | 人妻无码久久一区二区三区免费 | 超碰公开免费 | 久久久久五月 | 美女涩涩网站 | 无码精品一区二区三区AV | 日韩伦理中文字幕 | 一区二区三区不卡在线观看 | 任我爽在线 | 久久免费视屏 | 国产在线一区二区三区四区 | 欧美精品久久久久久久多人混战 | 69热在线观看 | 国产精品乱码久久久久久 | 国产男女裸体做爰爽爽 | 日韩精品小视频 | 91鲁| 五月婷婷激情小说 | 成人p站在线观看 | av中文字幕免费在线观看 | 中文字幕在线播放一区二区 | 美女扒开尿口给男人桶 | 15—16女人毛片 | 播放毛片 | 蜜臀在线播放 | 松本一香在线播放 | 国产精品无码一区二区三 | 成人免费视频网站在线看 | 好看的av在线 | 免费簧片在线观看 | 中文字幕在线观看视频免费 | 亚洲福利 | 麻豆成人免费 | 亚洲欧洲日韩 | 18被视频免费观看视频 | 西西人体www大胆高清 | 国产高清一区二区三区四区 |