一致性哈希java实现
值得注意的点
- 哈希函数的选择
- murmur哈希函数
该函数是非加密型哈希,性能高,且发生哈希碰撞的概率据说很低 - md5
- SHA
- 可以选择guava包,提供了丰富的哈希函数的API
支持虚拟节点+加权,因为不同的节点可能资源配置不同,加权可以使负载均衡最大化,虚拟节点,可以降低某个节点出现问题后对整个哈希环的冲击
考虑到不同场景用来作哈希的key可能不一样,所以提供一个包装类Node,可以自定义key,且可以自定义权重
安全问题,添加节点和删除节点是需要重建哈希环,此处要考虑并发情况的发生(此处暂未实现),一般情况下只需初始化一次即可。
哈希后的取值,本处为了通用采用String类型,可以针对特殊场景作优化,个人认为只有最适合的,没有最好的
实现
- 包装类node
public final class Node<T> {
public static final int DEFAULT_WEIGHT = 1;
private T target;
private String key;
private int weight = DEFAULT_WEIGHT;
public Node(T target) {
this.target = target;
this.key = target.toString();
}
public Node(T target, String key) {
this.target = target;
this.key = key;
}
public Node(T target, String key, int weight) {
this.target = target;
this.key = key;
this.weight = weight;
}
public T getTarget() {
return target;
}
public void setTarget(T target) {
this.target = target;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
}
- 一致性哈希
import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;
import java.nio.charset.Charset;
import java.util.*;
/**
* 一致性哈希
* @param <T>
*/
public class ConsistentHash<T> {
//哈希函数
private HashFunction hashFunction = Hashing.murmur3_32();
//哈希环
private TreeMap<String, Node<T>> nodeMappings = new TreeMap<>();
//虚拟节点数
private int replicas = 160;
//真实节点
private List<Node<T>> realNodes;
public ConsistentHash(HashFunction hashFunction, List<Node<T>> realNodes, int replicas) {
this.hashFunction = hashFunction;
this.realNodes = realNodes;
this.replicas = replicas;
}
public ConsistentHash(HashFunction hashFunction, List<Node<T>> realNodes) {
this.hashFunction = hashFunction;
this.realNodes = realNodes;
}
public ConsistentHash(List<Node<T>> realNodes, int replicas) {
this.realNodes = realNodes;
this.replicas = replicas;
}
public ConsistentHash(List<Node<T>> realNodes) {
this.realNodes = realNodes;
}
/**
* 初始化哈希环
*/
public void init(){
realNodes.forEach(node -> {
for (int i = 0; i < replicas*node.getWeight(); i++) {
StringBuilder sb = new StringBuilder(node.getKey());
sb.append(i);
nodeMappings.put(hashCode(sb.toString()), node);
}
});
}
public String hashCode(String key){
return hashFunction.hashString(key, Charset.defaultCharset()).asBytes().toString();
}
public Node<T> getNode(String key){
SortedMap<String, Node<T>> tailMap = nodeMappings.tailMap(hashCode(key));
if(tailMap.isEmpty()){
return nodeMappings.get(nodeMappings.firstKey());
}
return tailMap.get(tailMap.firstKey());
}
public static void main(String[] args) {
List<Node<String>> realNodes = Arrays.asList(new Node("127.0.0.1"),new Node("192.168.4.175"),new Node("192.168.3.175"), new Node("172.147.0.101"));
ConsistentHash consistentHash = new ConsistentHash(Hashing.md5(), realNodes);
consistentHash.init();
List<Node> one = new ArrayList<>();
List<Node> two = new ArrayList<>();
List<Node> three = new ArrayList<>();
List<Node> four = new ArrayList<>();
for (int i = 0; i <10000 ; i++) {
Node<String> node = consistentHash.getNode("node"+i);
if(node.getKey().equals("127.0.0.1")){
one.add(node);
}
if(node.getKey().equals("192.168.4.175")){
two.add(node);
}
if(node.getKey().equals("192.168.3.175")){
three.add(node);
}
if(node.getKey().equals("172.147.0.101")){
four.add(node);
}
}
System.out.println(one.size());
System.out.println(two.size());
System.out.println(three.size());
System.out.println(four.size());
}
一致性哈希java实现的更多相关文章
- 一致性哈希Java源码分析
首次接触一致性哈希是在学习memcached的时候,为了解决分布式服务器的负载均衡或者说选路的问题,一致性哈希算法不仅能够使memcached服务器被选中的概率(数据分布)更加均匀,而且使得服务器的增 ...
- Java_一致性哈希算法与Java实现
摘自:http://blog.csdn.net/wuhuan_wp/article/details/7010071 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具 ...
- 一致性哈希算法学习及JAVA代码实现分析
1,对于待存储的海量数据,如何将它们分配到各个机器中去?---数据分片与路由 当数据量很大时,通过改善单机硬件资源的纵向扩充方式来存储数据变得越来越不适用,而通过增加机器数目来获得水平横向扩展的方式则 ...
- 一致性哈希算法原理及Java实现
一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单 ...
- 一致性哈希与java实现
一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具体的节点上,如果采用普通的hash方法,将数据映射到具体的节点上,如key%N,key是数据的key,N是机器节点数 ...
- 一致性哈希算法原理、避免数据热点方法及Java实现
一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单 ...
- 负载均衡-基础-一致性哈希算法及java实现
一致性hash算法,参考: http://www.blogjava.net/hello-yun/archive/2012/10/10/389289.html 针对这篇文章,加入了自己的理解,在原有的代 ...
- 一致性哈希算法与Java实现
原文:http://blog.csdn.net/wuhuan_wp/article/details/7010071 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具 ...
- [转载] 应用于负载均衡的一致性哈希及java实现
转载自http://blog.csdn.net/haitao111313/article/details/7537799 这几天看了几遍一致性哈希的文章,但是都没有比较完整的实现,因此试着实现了一下, ...
随机推荐
- 万能选项卡,tab选项卡
//万能选项卡 function PaPtabs(thisObj, num) { if (thisObj.className == "active") return; var ta ...
- 微信小程序部署问题总结
1.微信小程序免费SSL证书Https 申请(阿里云申请) 进入阿里云控制台后,选择CA证书服务 选择购买证书 但是阿里云的免费SSL证书藏得比较深,得这样操作才能显示出免费证书 点击Symantec ...
- 微信小程序一:微信小程序UI组件、开发框架、实用库
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/8079095.html 内容持续更新,维护中 邮箱 ...
- commons-dbutils 字段名称转换
我们在写bean的时候,字段通常都使用小驼峰命名法,但是在设计数据库时,一般使用下划线分割命名.这样,在取出数据库字段时,还需要转换.如何简洁的实现这种转换呢? 你能遇到的问题,只要是普遍存在的,大家 ...
- Spring异常处理@ExceptionHandler
最近学习Spring时,认识到Spring异常处理的强大.之前处理工程异常,代码中最常见的就是try-catch-finally,有时一个try,多个catch,覆盖了核心业务逻辑: try{ ... ...
- Python核心编程笔记--动态属性
一.动态语言与静态语言 1.1 静态语言特点: a. 在定义变量时需要指定变量的类型,根据指定的类型来确定变量所占的内存空间 b. 需要经过编译才能运行 c. 在代码编译后,运行过程不能对代码进行操作 ...
- mysql如何执行关联查询与优化
mysql如何执行关联查询与优化 一.前言 在数据库中执行查询(select)在我们工作中是非常常见的,工作中离不开CRUD,在执行查询(select)时,多表关联也非常常见,我们用的也比较多,那么m ...
- JQueryPagination分页插件,ajax从struts请求数据
2017-07-16 学完了struts,做了个关于分页的小例子,用到了JQuery分页插件Pagination,先贴下插件下载地址 http://www.jq22.com/jquery-info13 ...
- 使用CJSON库实现XML与JSON格式的相互转化
之前完成了一个两个平台对接的项目.由于这两个平台一个是使用json格式的数据,一个是使用xml格式的数据,要实现它们二者的对接就涉及到这两个数据格式的转化,在查阅相关资料的时候发现了这个CJSON库, ...
- iOS中 学会如何对sqlite3 进行封装 (纯手工)
#waring ---(看官注意) ---使用说明: ①在创建自定义model类之前让该类继承自文件中的Model类, ②为model类选一个NSString属性作为主键:(既,在初始化方法里面将从父 ...