`
thrillerzw
  • 浏览: 143738 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

源码分析Memcached-Java-Client一致性hash算法

 
阅读更多
memcached的分布式主要体现在client端,server之间没有关系。
一致性hash算法:cache不能命中的问题仍然存在,但是只存在于2个节点之间的位置。相对于取模的算法,一致性hash算法除了计算key的hash值外,还会计算每个server对应的hash值,然后将这些hash值映射到一个有限的值域上(比如0~2^32)。通过寻找hash值等于大于hash(key)的最小server作为存储该key数据的目标server。如果找不到,则直接把具有最小hash值的server作为目标server。
源码版本:Memcached-Java-Client-release_2.6.1
1、计算每个server对应的hash值,将值存入treemap 排序模拟圆,主要方法代码入下。
private void populateConsistentBuckets() {
  // store buckets in tree map
  consistentBuckets = new TreeMap<Long, String>();
  MessageDigest md5 = MD5.get();
  if (this.totalWeight <= 0 && this.weights != null) {
   for (int i = 0; i < this.weights.length; i++)
    this.totalWeight += (this.weights[i] == null) ? 1 : this.weights[i];
  } else if (this.weights == null) {
   this.totalWeight = this.servers.length;
  }
  for (int i = 0; i < servers.length; i++) {
   int thisWeight = 1;
   if (this.weights != null && this.weights[i] != null)
    thisWeight = this.weights[i];
   double factor = Math.floor(((double) (40 * this.servers.length * thisWeight)) / (double) this.totalWeight);
      //根据权重控制虚拟节点数量 (factor * 4)。
   for (long j = 0; j < factor; j++) {
    byte[] d = md5.digest((servers[i] + "-" + j).getBytes());
    //192.168.211.240:11212-0 。。。 192.168.211.240:11212-39
//	 System.out.println("server key="+servers[i] + "-" + j);
    for (int h = 0; h < 4; h++) {
     Long k = ((long) (d[3 + h * 4] & 0xFF) << 24) | ((long) (d[2 + h * 4] & 0xFF) << 16)
       | ((long) (d[1 + h * 4] & 0xFF) << 8) | ((long) (d[0 + h * 4] & 0xFF));
     //按Long值从小到大排序
     consistentBuckets.put(k, servers[i]);
    }
   }
   // Create a socket pool for each host
   // Create an object pool to contain our active connections
   GenericObjectPool gop;
   SchoonerSockIOFactory factory;
   if (authInfo != null) {
    factory = new AuthSchoonerSockIOFactory(servers[i], isTcp, bufferSize, socketTO, socketConnectTO,
      nagle, authInfo);
   } else {
    factory = new SchoonerSockIOFactory(servers[i], isTcp, bufferSize, socketTO, socketConnectTO, nagle);
   }
   gop = new GenericObjectPool(factory, maxConn, GenericObjectPool.WHEN_EXHAUSTED_BLOCK, maxIdle, maxConn);
   factory.setSockets(gop);
   socketPool.put(servers[i], gop);
  }
  System.out.println("consistentBuckets="+consistentBuckets);
 }
 输出:
consistentBuckets={7786957=192.168.211.240:11212, 13055238=192.168.211.240:11212, 15819052=192.168.211.240:11211,。。。 4294784513=192.168.211.240:11212}
2、计算存储数据key hash,寻找目标server。
consistentBuckets.get(bucket)
 //计算客户端key hash值
 private static long md5HashingAlg(String key) {
  MessageDigest md5 = MD5.get();
  md5.reset();
  md5.update(key.getBytes());
  byte[] bKey = md5.digest();
  long res = ((long) (bKey[3] & 0xFF) << 24) | ((long) (bKey[2] & 0xFF) << 16) | ((long) (bKey[1] & 0xFF) << 8)
    | (long) (bKey[0] & 0xFF);
  System.out.println("key="+key+" hash result="+res);
  return res;
 }
输出:
 key=1 hash result=943901380
 key=2 hash result=2373066440
 
 //查找目标server
 private final Long findPointFor(Long hv) {
  // this works in java 6, but still want to release support for java5
  // Long k = this.consistentBuckets.ceilingKey( hv );
  // return ( k == null ) ? this.consistentBuckets.firstKey() : k;
    //hash值等于大于hash(key)的最小server作为存储该key数据的目标server。
  SortedMap<Long, String> tmap = this.consistentBuckets.tailMap(hv);
  System.out.println("hash result="+hv+" tailMap="+tmap);
  //如果找不到,则直接把具有最小hash值的server作为目标server。
  return (tmap.isEmpty()) ? this.consistentBuckets.firstKey() : tmap.firstKey();
 }
 
输出:
hash result=943901380 tailMap={948021698=192.168.211.240:11212, 973571166=192.168.211.240:11212, 。。。4294784513=192.168.211.240:11212}
 
 
0
0
分享到:
评论

相关推荐

    Memcached-Java-Client-3.0.2.jar

    Memcached-Java-Client-3.0.2.jar

    Memcached-Java-Client-release_2.6.1.zip

    - **一致性哈希**:Memcached-Java-Client支持一致性哈希策略,确保数据分布均匀,减小添加或移除服务器时的数据迁移。 - **序列化与反序列化**:默认情况下,Java对象需要序列化为字节数组才能存储。可以自定义...

    Memcached-Java-Client-3.0.1.jar

    Memcached-Java-Client3.0.1

    java-memcached-2.6.6.jar

    java-memcached-2.6.6.jar

    memcached-1.2.1-win32.zip 和 java_memcached-release_1.6.zip

    `memcached-1.2.1-win32.zip` 提供了Memcached服务端,而`java_memcached-release_1.6.zip` 提供了Java客户端,使得开发者能够轻松地在Java环境中集成和使用Memcached。学习和掌握这些资源,将有助于构建更加快速、...

    session共享 memcached-session-manager 1.9.6 jar

    `memcached-session-manager`是Java的一个库,用于在基于Tomcat的Web应用中实现基于Memcached的session共享,这在分布式环境中尤为重要。 标题中的"session共享 memcached-session-manager 1.9.6 jar"指的正是这个...

    memcached-session-manager+tomcat8.5_memcached-1.9.6.zip

    memcached-1.9.6,libevent-2.1.12-stable.tar memcached-session-manager-1.9.6,msm-kryo-serializer-1.9.6.jar,tomcat8.5,实现会话共享

    memcached-client.php

    memcached-client.php

    java_memcached-release_2.5.1.jar Memcache java jar 包

    在本例中,我们关注的是`java_memcached-release_2.5.1.jar`这个文件,这是一个包含了Java Memcached客户端库的JAR(Java Archive)包,版本号为2.5.1。 Java Memcached客户端库由Danga Interactive开发,该公司是...

    memcached-win64-1.4.4-14.zip

    这里我们关注的是针对Windows 64位系统的版本——`memcached-win64-1.4.4-14.zip`。 标题中的`memcached-win64-1.4.4-14.zip`表明这是Memcached的一个特定版本,适用于64位Windows操作系统。版本号1.4.4-14意味着这...

    java_memcached-release_2.0.1.jar

    java_memcached-release_2.0.1.jar。jdk5版本适用。使用log4j。

    memcached-1.5.11.tar.gz

    4. 基于一致性哈希的分布式策略:在多台服务器部署时,Memcached使用一致性哈希算法,保证数据迁移时尽可能少地改变映射关系。 四、Memcached的API及使用 1. 客户端库:Memcached提供了多种语言的客户端库,如PHP...

    memcached-1.5.4

    **memcached-1.5.4源码分析与编译指南** `memcached`是一款高性能、分布式的内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库负载,提高数据访问速度。它通过将数据存储在内存中,实现快速读取,避免了频繁...

    cas-client-support-distributed-memcached-3.2.0.jar

    cas-client-support-distributed-memcached-3.2.0.jar

    memcached-session-manager

    2. **Java Servlet会话管理**:在Java Web开发中,Servlet规范定义了会话接口HttpSession,memcached-session-manager 是一个实现该接口的第三方库,允许开发者将默认的基于内存的会话存储替换为分布式存储。...

    memcached-win-32/64-1.4.4-14

    memcached的基本设置: -p 监听的端口 -l 连接的IP地址, 默认是本机 -d start 启动memcached服务 -d restart 重起memcached服务 -d stop|shutdown 关闭正在运行的memcached服务 -d install 安装memcached服务 -d ...

    Memcached-session-manager使用说明及相关jar包(tomcat7版)

    Memcached-session-manager使用说明及相关jar包(tomcat7版) 依照文档部署即可实现多服务器多tomcat session共享,jar包中是tomcat7集成所需要的jar包,序列化工具用的是java默认的序列化工具,若要使用其他版本的...

    memcached java client

    本篇文章将详细介绍两个常用的Java Memcached客户端:xmemcached和memcache-client-forjava。 **1. xmemcached** xmemcached是由Ketoo开发的一个高性能、高可用性的Java Memcached客户端。它提供了丰富的API,支持...

    tomcat-7.0.54配合使用的memcached-session-manager1.6.1的整套jar包

    2. `spymemcached-2.8.4.jar`:这是一个Java客户端库,用于连接和通信Memcached服务器,`memcached-session-manager`依赖它来与Memcached交互。 3. `netty-3.9.9.Final.jar`:Spymemcached使用的NIO库,提供非阻塞I/...

    memcached-win-1.5.6.rar

    标题中的 "memcached-win-1.5.6.rar" 指的是 Memcached 的 Windows 版本,具体为 1.5.6 版本的安装包。 在Windows环境下,通常使用 `.bat` 文件来执行一些批处理命令,`start.bat` 文件就是这样一个批处理脚本,它...

Global site tag (gtag.js) - Google Analytics