代码一致性 java_java实现一致性hash算法实例代码
一致性hash算法java版本简单实现
package com.java4all.grouth.consistent;
import java.util.LinkedList;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 一致性hash算法java简易实现
* @author IT云清
* 参考:https://blog.csdn.net/zhanglu0223/article/details/100579254
*/
public class ConsistentHash {
private static final Logger LOGGER = LoggerFactory.getLogger(ConsistentHash.class);
/**
* 虚拟节点个数
* 每个真实节点对应的虚拟节点个数
*/
private static final int VIRTUAL_NUM = 5;
/**
* 虚拟节点
* eg:<656715414,192.168.1.1&&VN3>
* 真实节点数量一般偏少,引入虚拟节点来平衡
* 每个真实节点对应多个虚拟节点,这样每个节点尽可能在hash环上均匀分布,可以根据虚拟节点找到真实节点
*/
private static SortedMap shards = new TreeMap<>();
/**
* 真实节点
*/
private static List realNodes = new LinkedList<>();
/**
* 模拟初始节点
*/
private static String[] servers = {"116.116.1.1", "116.116.1.2", "116.116.1.3", "116.116.1.5", "116.116.1.6"};
/**
* 初始化虚拟节点
*/
static {
for (String server : servers) {
realNodes.add(server);
LOGGER.info("添加真实节点{}",server);
for(int i = 0;i < VIRTUAL_NUM; i ++){
String virtualNode = server + "&&VN" + i;
int hash = getHash(virtualNode);
shards.put(hash,virtualNode);
LOGGER.info("添加虚拟节点{},hash为{}",virtualNode,hash);
}
}
}
public static void main(String[]args){
test2();
}
public static void test2(){
//测试定位node
LOGGER.info(getSever("aa"));
LOGGER.info(getSever("涨三"));
LOGGER.info(getSever("num_19120000"));
LOGGER.info(getSever("num_19120000"));
LOGGER.info("------------------");
//测试添加节点
addNode("192.192.116.1");
addNode("192.192.116.2");
LOGGER.info("------------------");
//测试删除节点
delNode("116.116.1.1");
}
/**
* 获取真实节点ip
* @param str 字符串
* @return
*/
public static String getSever(String str){
//计算hash
int hash = getHash(str);
Integer key = null;
//寻找最近的虚拟node
SortedMap tailMap = shards.tailMap(hash);
//获取在hash环上 右侧最近的虚拟节点的key
key = tailMap.isEmpty() ? shards.lastKey() : tailMap.firstKey();
//根据hash获取虚拟节点
String virtualNode = shards.get(key);
//返回虚拟节点的真实ip
return virtualNode.substring(0,virtualNode.indexOf("&&"));
}
/**
* 添加节点
* @param node
*/
public static void addNode(String node){
if(!realNodes.contains(node)){
realNodes.add(node);
LOGGER.info("新增真实节点上线,{}",node);
for(int i = 0;i < VIRTUAL_NUM;i ++){
String virtualNode = node + "&&VN" + i;
int hash = getHash(virtualNode);
shards.put(hash,virtualNode);
LOGGER.info("新增虚拟节点{},hash为{}",virtualNode,hash);
}
}
}
/**
* 删除节点
* @param node
*/
public static void delNode(String node){
if(realNodes.contains(node)){
//下线真实节点
realNodes.remove(node);
LOGGER.info("真实节点下线,{}",node);
for(int i = 0;i < VIRTUAL_NUM; i++){
String virtualNode = node + "&&VN" + i;
int hash = getHash(virtualNode);
//移除虚拟节点
shards.remove(hash);
LOGGER.info("下线虚拟节点{},hash为{}",virtualNode,hash);
}
}
}
/**
* FNV1_32_HASH算法
* @param str 任意字符串
* @return 返回int类型的hash值
*/
private static int getHash(String str) {
final int p = 16777619;
int hash = (int) 2166136261L;
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);
}
return hash;
}
}
代码一致性 java_java实现一致性hash算法实例代码相关推荐
- 计算1至1000间的合数c语言,输出1000以内的素数的算法(实例代码)
输出1000以内的素数的算法(实例代码) 代码如下所示: 复制代码 代码如下: #include "stdafx.h" #include #include bool IsSushu ...
- 聚类算法-最大最小距离算法(实例+代码)
聚类算法-最大最小距离算法(实例+代码) [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/53708042 目录 聚类算法- ...
- 异或加密的java算法_Java使用异或运算实现简单的加密解密算法实例代码
Java简单的加密解密算法,使用异或运算 实例1: package cn.std.util; import java.nio.charset.Charset; public class DeEnCod ...
- python实现冒泡排序完整算法_利用python实现冒泡排序算法实例代码
利用python实现冒泡排序算法实例代码 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数 ...
- 中文分词算法python代码_python实现中文分词FMM算法实例
本文实例讲述了python实现中文分词FMM算法.分享给大家供大家参考.具体分析如下: FMM算法的最简单思想是使用贪心算法向前找n个,如果这n个组成的词在词典中出现,就ok,如果没有出现,那么找n- ...
- 人工神经网络算法实例代码,人工神经网络算法步骤
神经网络算法实例说明有哪些? 在网络模型与算法研究的基础上,利用人工神经网络组成实际的应用系统,例如,完成某种信号处理或模式识别的功能.构作专家系统.制成机器人.复杂系统控制等等. 纵观当代新兴科学技 ...
- python堆排序算法代码_python堆排序算法实例代码
python 实现堆排序算法代码,需要的朋友可以参考下 代码如下:#!/usr/bin/python import sys def left_child(node): return node * 2 ...
- python简单代码编写-python读写Excel表格的实例代码(简单实用)
安装两个库:pip install xlrd.pip install xlwt 1.python读excel――xlrd 2.python写excel――xlwt 1.读excel数据,包括日期等数据 ...
- python读取txt文件代码-python批量处理txt文件的实例代码
通过python对多个txt文件进行处理 读取路径,读取文件 获取文件名,路径名 对响应的文件夹名字进行排序 对txt文件内部的数据相应的某一列/某一行进行均值处理 写入到事先准备好的Excel文件中 ...
- python3爬虫实例代码-Python3爬虫带上cookie的实例代码
Cookie的英文原意是"点心",它是在客户端访问Web服务器时,服务器在客户端硬盘上存放的信息,好像是服务器发送给客户的"点心".服务器可以根据Cookie来 ...
最新文章
- servlet必知细节(一)
- mysql 存储guid_我应该如何在MySQL表中存储GUID?
- 【css】怎么让Chrome支持小于12px 的文字
- 深度学习核心技术精讲100篇(六十三)-【CNN】一文详细讲解前因后果
- Linux 技巧: Bash 测试和比较函数
- python-字符串的格式化输出format
- Java初学者不可不知道知识点
- 但是在公司开空调睡觉还是冷
- 对于.net开发的程序谷歌输入法输入优于搜狗
- 倒数15日开幕!第八届全球云计算大会解锁主论坛重磅嘉宾
- 含并行连结的网络(GoogLeNet)
- java百元买百兔 穷举法_JAVA--算法与数据结构- 逢7过百钱白鸡不死神兔【1/100】...
- jcyzoj1505: 原地tp
- Rocksdb prefix Bloomfilter
- ipad上html语言编辑,在 iPad 上键入和编辑文本的小技巧
- IDEA使用单元测试对数据库的insert语句进行测试,出现添加多条问题的解决方案
- (83)Part21-阿里云VOD-03-视频播放测试
- 图论及其应用 学习笔记(一)图的基本概念
- windows命令----netstat命令
- win7 (win 10) 新建文件夹的 快捷键