⼀致性Hash算法编码实现

⼀致性Hash算法 不含虚拟节点

import java.util.SortedMap;
import java.util.TreeMap;
public class ConsistentHashNoVirtual {
 public static void main(String[] args) {
 //step1 初始化:把服务器节点IP的哈希值对应到哈希环上
 // 定义服务器ip
 String[] tomcatServers = new String[]
{"123.111.0.0","123.101.3.1","111.20.35.2","123.98.26.3"};
 SortedMap<Integer,String> hashServerMap = new TreeMap<>();
 for(String tomcatServer: tomcatServers) {
 // 求出每⼀个ip的hash值,对应到hash环上,存储hash值与ip的对应关系
 int serverHash = Math.abs(tomcatServer.hashCode());
 // 存储hash值与ip的对应关系
 hashServerMap.put(serverHash,tomcatServer);
 }
 //step2 针对客户端IP求出hash值
 // 定义客户端IP
 String[] clients = new String[]
{"10.78.12.3","113.25.63.1","126.12.3.8"};
 for(String client : clients) {
 int clientHash = Math.abs(client.hashCode());
 //step3 针对客户端,找到能够处理当前客户端请求的服务器(哈希环上顺时针最
近)
 // 根据客户端ip的哈希值去找出哪⼀个服务器节点能够处理()
 SortedMap<Integer, String> integerStringSortedMap =
hashServerMap.tailMap(clientHash);
 if(integerStringSortedMap.isEmpty()) {
 // 取哈希环上的顺时针第⼀台服务器
 Integer firstKey = hashServerMap.firstKey();
 System.out.println("==========>>>>客户端:" + client + " 被
路由到服务器:" + hashServerMap.get(firstKey));
 }else{
 Integer firstKey = integerStringSortedMap.firstKey();
 System.out.println("==========>>>>客户端:" + client + " 被
路由到服务器:" + hashServerMap.get(firstKey));
 }
 }
 }
}

⼀致性Hash算法实现(含虚拟节点)

import java.util.SortedMap;
import java.util.TreeMap;
public class ConsistentHashWithVirtual {
 public static void main(String[] args) {
 //step1 初始化:把服务器节点IP的哈希值对应到哈希环上
 // 定义服务器ip
 String[] tomcatServers = new String[]
{"123.111.0.0","123.101.3.1","111.20.35.2","123.98.26.3"};
 SortedMap<Integer,String> hashServerMap = new TreeMap<>();
 // 定义针对每个真实服务器虚拟出来⼏个节点
 int virtaulCount = 3;
 for(String tomcatServer: tomcatServers) {
 // 求出每⼀个ip的hash值,对应到hash环上,存储hash值与ip的对应关系
 int serverHash = Math.abs(tomcatServer.hashCode());
 // 存储hash值与ip的对应关系
 hashServerMap.put(serverHash,tomcatServer);
 // 处理虚拟节点
 for(int i = 0; i < virtaulCount; i++) {
 int virtualHash = Math.abs((tomcatServer + "#" + i).hashCode());
 hashServerMap.put(virtualHash,"----由虚拟节点"+ i + "映射过
来的请求:"+ tomcatServer);
 }
 }
 //step2 针对客户端IP求出hash值
 // 定义客户端IP
 String[] clients = new String[]
{"10.78.12.3","113.25.63.1","126.12.3.8"};
 for(String client : clients) {
 int clientHash = Math.abs(client.hashCode());
 //step3 针对客户端,找到能够处理当前客户端请求的服务器(哈希环上顺时针最
近)
 // 根据客户端ip的哈希值去找出哪⼀个服务器节点能够处理()

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时小浅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值