一致性哈希算法用于在分布式系统中进行负载均衡。它通过将服务器和数据都映射到一个环上,根据数据对应的哈希值在环上查找对应的服务器。一致性哈希算法的优点是在服务器数量发生变化时,只有少量的数据需要重新映射,而不需要全部重新映射。
下面是一致性哈希算法的Java实现:
public class ConsistentHash<T> {
private final HashFunction hashFunction;
private final int numberOfReplicas;
private final SortedMap<Integer, T> circle = new TreeMap<>();
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++) {
int hash = hashFunction.hash(node.toString() + i);
circle.put(hash, node);
}
}
public void remove(T node) {
for (int i = 0; i < numberOfReplicas; i++) {
int hash = hashFunction.hash(node.toString() + i);
circle.remove(hash);
}
}
public T get(Object key) {
if (circle.isEmpty()) {
return null;
}
int hash = hashFunction.hash(key.toString());
if (!circle.containsKey(hash)) {
SortedMap<Integer, T> tailMap = circle.tailMap(hash);
hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey();
}
return circle.get(hash);
}
}
public interface HashFunction {
int hash(String key);
}