关于一致性hash算法的意义以及其相对于简单求余法(除数求余法)的好处,查看第六章 memcached剖析
注意:真实的hash环的数据结构是二叉树,这里为了简便使用了列表List
1、一致性hash算法的使用地方
- memcached服务器
- Jedis分片机制
2、真实服务器节点没有虚拟化的一致性hash算法实现
ServerNode:真实服务器节点
1 package hash; 2 3 /** 4 * server节点 5 */ 6 public class ServerNode { 7 private String serverName; 8 private long serverHash; 9 10 public String getServerName() { 11 return serverName; 12 } 13 14 public void setServerName(String serverName) { 15 this.serverName = serverName; 16 } 17 18 public long getServerHash() { 19 return serverHash; 20 } 21 22 public void setServerHash(long serverHash) { 23 this.serverHash = serverHash; 24 } 25 26 /** 27 * 下边重写hashcode()和equals()是为了在删除节点的时候只根据传入的serverName删除即可 28 */ 29 @Override 30 public int hashCode() { 31 final int prime = 31; 32 int result = 1; 33 result = prime * result 34 + ((serverName == null) ? 0 : serverName.hashCode()); 35 return result; 36 } 37 38 @Override 39 public boolean equals(Object obj) { 40 if (this == obj) 41 return true; 42 if (obj == null) 43 return false; 44 if (getClass() != obj.getClass()) 45 return false; 46 ServerNode other = (ServerNode) obj; 47 if (serverName == null) { 48 if (other.serverName != null) 49 return false; 50 } else if (!serverName.equals(other.serverName)) 51 return false; 52 return true; 53 } 54 55 56 }