ConsistentHash

本文介绍了一致性哈希算法的基本原理及其应用场景。该算法通过将服务器节点和数据项映射到一个环形空间中,实现了当节点增删时最小化数据迁移的目标。文章通过实例解释了如何使用一致性哈希来定位缓存服务器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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两个点不会受到任何干扰。




/**
 * 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;
    }

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值