看到点关于一致性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. VUE的安装与Django之间打通数据

    一  VUE的安装与项目创建 1.1.安装nodeJS 官网下载安装:https://nodejs.org/zh-cn/ 1.2.安装脚手架 vue官网 => 学习 => 教程 => ...

  2. UVA Team Queue

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013840081/article/details/26180081 题目例如以下: Team Qu ...

  3. 002-shell变量定义、使用、字符串、数组、注释

    一.变量定义 定义变量时,变量名不加美元符号($) name="lhx" 注意,变量名和等号之间不能有空格.同时,变量名的命名须遵循如下规则: 命名只能使用英文字母,数字和下划线, ...

  4. FindBugs——帮助查找隐藏的bug

    FindBugs 1.什么是FindBugs FindBugs 是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题.有了静态分析工具,就可以在不实际运行程序 ...

  5. 解决Centos关闭You have new mail in /var/spool/mail/root提示(转)

    今天查看内存的时候 出现一天奇怪的提示 You have new mail in /var/spool/mail/root 有的时候每敲一下回车,就出来You have new mail in /va ...

  6. 内存检查工具Valgrind

    官网介绍:http://www.valgrind.org/ Valgrind is an instrumentation framework for building dynamic analysis ...

  7. Using RUNDLL32.exe to call a function within a dll

    Using RUNDLL32.exe to call a function within a dll        Rundll32 is a utility included with Window ...

  8. HomeBrew的安装详细步骤

    1)终端输入:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master ...

  9. spring boot 引导

    链接:https://www.zhihu.com/question/39483566/answer/243413600 Spring Boot 的优点快速开发,特别适合构建微服务系统,另外给我们封装了 ...

  10. PL/SQL编程—存储过程

    SQL> create or replace procedure sp_pro3(name_in varchar2,id_in varchar2) is begin update mytest ...