看到点关于一致性hash的说明,觉得挺有意思,就想体验一下。

上代码看看,体会一下在一致性hash环境下的cache和获取。

因为是小代码演示,没有很细致,包括hash函数就是用取余操作,但活生生的显示出来一致性hash环境下,增减服务器对hash分布的影响(关于这个演示,要靠手工尝试)。

 package com.test.algorithms;

 import java.util.Arrays;
import java.util.HashSet;
import java.util.Set; public class ConsistentHash { private static final int CYCLE_SIZE = 128; public static void main(String[] args){
Machine[] machines = new Machine[]{//new Machine("cache-server-1", "192.168.10.10"),
new Machine("cache-server-2", "192.168.10.11"),
new Machine("cache-server-3", "192.168.10.12"),
new Machine("cache-server-4", "192.168.10.13")
}; for(Machine m : machines){
m.setHashOrder(hash(m.hashCode()));
}
Arrays.sort(machines); for(int j=1; j<10000; j+=17){
String cacheThing = "cache"+j;
int hash = hash(cacheThing.hashCode());
if(hash < 0 ){
hash = -1 * hash;
}
// System.out.println(cacheThing+" == "+hash+" == "+cacheThing.hashCode());
for(int i=0, size = machines.length;i<size;i++){
if(hash <= machines[i].getHashOrder()){
machines[i].addToCache(cacheThing);
break;
} else if(i == size-1){
machines[0].addToCache(cacheThing);
break;
}
}
} for(Machine m : machines){
System.out.println(m);
}
} public static int hash(int input){
return input % CYCLE_SIZE;
} public static class Machine implements Comparable<Machine>{
private String ip;
private String name;
private int hashOrder; private Set<String> cache = new HashSet<String>(); public Machine(String name, String ip){
this.name = name;
this.ip = ip;
} public void setHashOrder(int hashOrder){
this.hashOrder = hashOrder;
} public void addToCache(String thing){
this.cache.add(thing);
} public Set<String> getCache(){
return this.cache;
} @Override
public int compareTo(Machine o) {
return this.hashOrder - o.hashOrder;
} public int getHashOrder(){
return this.hashOrder;
} @Override
public int hashCode(){
int rs = 17;
rs = 31*rs + ip.hashCode();
rs = 31*rs + name.hashCode();
return rs;
} @Override
public String toString() {
return "Machine{" +
"ip='" + ip + '\'' +
", name='" + name + '\'' +
", hashOrder=" + hashOrder +
", cache size=" + this.cache.size()+
// ", cache=" + cache +
'}';
}
} }

运行之后,可以看到各个machine里面有多少个cache值,也就是看看分布情况,如果分布不理想,可以通过调整cycle_size来影响。

我测试了128,256,512,1024,发现128最均匀。其实这个东西的关键就是hash函数。

有好的hash函数,可以推荐哈。

一致性hash演示的更多相关文章

  1. 对一致性Hash算法,Java代码实现的深入研究

    一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...

  2. memcache的一致性hash算法使用

    一.概述 1.我们的memcache客户端(这里我看的spymemcache的源码),使用了一致性hash算法ketama进行数据存储节点的选择.与常规的hash算法思路不同,只是对我们要存储数据的k ...

  3. Java实现一致性Hash算法深入研究

    一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中”一致性Hash算法”部分,对于为什么要使用一致性Hash算法和一致性Hash算法的算法原 ...

  4. OpenStack_Swift源代码分析——Ring基本原理及一致性Hash算法

    1.Ring的基本概念 Ring是swfit中最重要的组件.用于记录存储对象与物理位置之间的映射关系,当用户须要对Account.Container.Object操作时,就须要查询相应的Ring文件( ...

  5. 一致性Hash算法与代码实现

    一致性Hash算法: 先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将服务器节点放置在这个Hash环上,然后根据数据的Key值 ...

  6. 数据分片一致性hash

    一致性hash 一致性hash是将数据按照特征值映射到一个首尾相接的hash环上,同时也将节点(按照IP地址或者机器名hash)映射到这个环上.对于数据,从数据在环上的位置开始,顺时针找到的第一个节点 ...

  7. 一致性hash的实现

    原文:https://blog.csdn.net/u011305680/article/details/79721030 1.不带虚拟节点的 package hash; import java.uti ...

  8. 一致性hash算法及java实现

    一致性hash算法是分布式中一个常用且好用的分片算法.或者数据库分库分表算法.现在的互联网服务架构中,为避免单点故障.提升处理效率.横向扩展等原因,分布式系统已经成为了居家旅行必备的部署模式,所以也产 ...

  9. 集群扩容的常规解决:一致性hash算法

    写这篇博客是因为之前面试的一个问题:如果memcached集群需要增加机器或者减少机器,那么其他机器上的数据怎么办? 最后了解到使用一致性hash算法可以解决,下面一起来学习下吧. 声明与致谢: 本文 ...

随机推荐

  1. pandas.read_csv() 部分参数解释

    read_csv()所有参数 pandas.read_csv( filepath_or_buffer, sep=',', delimiter=None, header='infer', names=N ...

  2. Flask之flask-session

    简介 flask-session是flask框架的session组件,由于原来flask内置session使用签名cookie保存,该组件则将支持session保存到多个地方,如: redis:保存数 ...

  3. python web 程序的9种部署方式

    python有很多web 开发框架,代码写完了,部署上线是个大事,通常来说,web应用一般是三层结构 Web Server====>    Application=====>   DB S ...

  4. first-child与:first-of-type的区别

    css选择器中:first-child与:first-of-type的区别 :first-child选择器是css2中定义的选择器,从字面意思上来看也很好理解,就是第一个子元素.比如有段代码: p:f ...

  5. Python 调用 Shell脚本的方法

    Python 调用 Shell脚本的方法 1.os模块的popen方法 通过 os.popen() 返回的是 file read 的对象,对其进行读取 read() 的操作可以看到执行的输出. > ...

  6. opencv学习(1.2) - Windows 10 安装OpenCV &配置VS 2015

    windows 10 安装OpenCV&配置VS 2015 环境 系统:Windows 10 OpenCV版本:3.4.1 开发IDE:VS2015 社区版 下载安装 下载OpenCV 3.4 ...

  7. django xadmin的全局配置

    在adminx.py中增加 class BaseSetting(object): enable_themes = True use_bootswatch = True class GlobalSett ...

  8. yii2美化url

    http://blog.csdn.net/xundh/article/details/45418265

  9. 转:在0~N(不包括N)范围内随机生成一个长度为M(M <= N)且内容不重复的数组

    1. 最朴素暴力的做法. void cal1() { , j = , num = ; int result[M]; result[] = rand() % N; //第一个肯定不重复, 直接加进去 ; ...

  10. 安卓和ios的区别

    安卓不闪退,会卡死,有几率复活,也有可能要强制重启,iOS默认闪退,强制重启的几率小很多. 总的来说,如果要深层次挖掘Android的漏洞就要明白linux内核安全,如果要挖身深层次挖掘iOS的漏洞就 ...