1.解决问题:解决互联网的热点问题,最典型应用是动态变换的分布式cache当中
2.研究目的:尽量减少损失,尽可能多的进行负载均衡分摊,实现分布式cache的合理分配
3.过程分析:
3.1 : 运用Hash算法将value值映射为2的32次方的Hash环
3.2 : 将cache对象 进行Hash,将key值映射到Hash空间中
3.3 : 将cache服务器本身进行Hash,将key值映射到Hash空间中
3.4 : 按一定方向(顺时针),对象的key与cache服务器key值比较,找到环内最近的服务器的key值结点,加入
3.5 : 考虑到单机的负载承受能力不同,可将 cache服务器结点按比例拆分成虚拟结点,保证负载均衡
4.代码资源模拟实现:见资源
5.官方代码实现:
import java.util.Collection;
import java.util.SortedMap;
import java.util.TreeMap;
public class ConsistentHash<T> {
private final HashFunction hashFunction;
private final int numberOfReplicas;
private final SortedMap<Integer, T> circle = new TreeMap<Integer, T>();
public ConsistentHash(HashFunction hashFunction, int numberOfReplicas,
Collection<T> nodes) {
this.hashFunction = hashFunction;
this.numberOfReplicas = numberOfReplicas;
for (T node : nodes) {
add(node);
}
}
public void add(T node) {
for (int i = 0; i < numberOfReplicas; i++) {
circle.put(hashFunction.hash(node.toString() + i), node);
}
}
public void remove(T node) {
for (int i = 0; i < numberOfReplicas; i++) {
circle.remove(hashFunction.hash(node.toString() + i));
}
}
public T get(Object key) {
if (circle.isEmpty()) {
return null;
}
int hash = hashFunction.hash(key);
if (!circle.containsKey(hash)) {
SortedMap<Integer, T> tailMap = circle.tailMap(hash);
hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey();
}
return circle.get(hash);
}
}