一致性哈希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 这几天看了几遍一致性哈希的文章,但是都没有比较完整的实现,因此试着实现了一下, ...
随机推荐
- 通过js添加的元素点击事件无法触发
var blk_have ='<div class="sw-off"></div>'; $('#blk').prepend(blk_have); $(doc ...
- K:线性表
1. 线性表在计算机中可以用顺序存储和链式存储两种存储结构来表示.其中用顺序存储结构表示的线性表成为顺序表,用链式存储结构表示的线性表称为链表,链表又有单链表,双向链表,循环链表之分. 2. 线性表是 ...
- Ubuntu安装微信
1.系统是Ubuntu 16.04 64位系统,在网上先去下载electronic-wechat-Linux https://github.com/geeeeeeeeek/electr ...
- MySQL常见连接查询
在实际应用中,由于不同的业务需求,一般的select查询语句无法满足要求.所以就需要了解一些MySQL的高级查询方式 内连接 inner join 典型的连接查询,有相等(=)连接和不等(<&g ...
- Android View的事件冲突
上一篇博客讨论了一下view中的事件分发,既然存在事件分发的过程,那么也就可能存在着冲突.常见的由以下三种形式的冲突.(外面叫做OuterViewGroup,包裹在里面的叫做InnerViewGrou ...
- 高效的CSS代码(1)
——阅读笔记,欢迎纠错 平时写CSS时常用的两个CSS文档(小杂感觉用的蛮喜欢,也是看了些书,尝试使用效果不错) /************CSS reset *********/ /******** ...
- CSS3的动画属性
transition.animation和transform是CSS3中三个制作动画的重要属性,本篇文章主要对其进行学习了解. 一.transition transition允许css的属性值在一定的 ...
- TurnipBit开发板“趣味赛”:平衡力大比拼
让孩子在快乐自由的游戏中培养编程思维 平衡力大挑战是我们经常经常玩的的一个小游戏,脑补画面的话比较常见的是单腿平衡力大比拼,摇晃幅度小者胜利.游戏好玩归好玩,但是想要公平判断胜负却不容易.下面就教大家 ...
- 前端工程之CDN部署
之前发的一篇文章<变态的静态资源缓存与更新>中提到了静态资源和页面部署之间的时间间隙问题,这个问题会迫使前端静态资源发布必须采用非覆盖式. 那篇文章中没有详细解释为什么会产生不可忍受的时间 ...
- jquery/Js属性无效
今天遇到个很奇葩的问题,就是checkbox的onchange时间无效,我一共写了两个checkbox的onchange事件,但就是只有一个能用,本来我以为是jquery的兼容问题,但是换成js还是不 ...