当前位置:编程学习 > JAVA >>

ConsistentHash

server点分布在很大的一个circle上,circle的点数量可以是int.MAX个。

每个key同样hash后,落到int.MAX个点的大circle上,寻找最近的server点。

加server时,或者移去server时,其它server落在circle上的位置不会变,所以最大限度避免了数据抖动。 如果是传统方法的hash算法,任何一个server节点的增加或者删除,都会导致整个系统的所有cache落点改变。


图1, A、B、C为三个缓存Server所在的点。 1-4是cache item key的hash值。

 

图2,移去C缓存、加入D缓存,1,2两个点不会受到任何干扰。

 


[java] 
/**
 * Consistent Hash Algorithm, see:
 * http://weblogs.java.net/blog/2007/11/27/consistent-hashing
 */ 
public class ConsistentHash<T> { 
 
    private SortedMap<Integer, T> circle; 
 
    public ConsistentHash(SortedMap<Integer, T> serverMap) { 
        this.circle = serverMap; 
    } 
 
    public T get(String key) { 
 
        int hash = hash32(key); 
        if (!circle.containsKey(hash)) { 
            SortedMap<Integer, T> tailMap = circle.tailMap(hash); 
            if (tailMap.isEmpty()) { 
                hash = circle.firstKey(); 
            } else { 
                hash = tailMap.firstKey(); 
            } 
        } 
        return circle.get(hash); 
    } 
     
    private static final int FNV_32_INIT = 0x711c9dc5; 
    private static final int FNV_32_PRIME = 0x01000193; 
    public static int hash32(final String k) { 
        int rv = FNV_32_INIT; 
        for(byte b : k.getBytes()) { 
            rv ^= b; 
            rv *= FNV_32_PRIME; 
        } 
        return rv; 
    } 
 

补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,