昨天听一个在找工作的朋友讲,他面试的时候被问到一致性哈希,问我到底什么是一致性哈希,我第一感觉就是,面试官应该问的是memcache或redis之类的分布式应用,一致性哈希主要思想是闭环,场景一般是降低因节点变化而导致缓存命中率降低的问题。其实这个问题老生常谈,网上很多,只是他没有遇到过罢了,我好像记得memcache或是redis都是单点的服务器,集群都是在客户端做的,不多说了,贴代码。
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;
/**
*
* @author <a href="mailto:yankai913@gmail.com">yankai</a>
* @date 2013-7-6
*/
public class ConsistentHash {
final SortedMap<Integer, String> virtualNodes = new TreeMap<Integer, String>();
final int virtualMappingNo = 10;
final List<String> realNodes;
public ConsistentHash(List<String> realNodes) {
this.realNodes = realNodes;
for (String node : this.realNodes) {
addNode(node);
}
}
int hash(String key) {
return key.hashCode();
}
void addNode(String node) {
for (int i = 0; i < virtualMappingNo; i++) {
virtualNodes.put(hash(node + i), node);
}
realNodes.add(node);
}
void removeNode(String node) {
for (int i = 0; i < virtualMappingNo; i++) {
virtualNodes.remove(hash(node + i));
}
realNodes.remove(node);
}
String get(String key) {
int hash = hash(key);
if (virtualNodes.containsKey(hash)) {
return virtualNodes.get(hash);
}
SortedMap<Integer, String> tail = virtualNodes.tailMap(hash);
if (tail.isEmpty()) {
return virtualNodes.get(virtualNodes.firstKey());
}
return tail.get(tail.firstKey());
}
}
