美文网首页
Guava 中的一致性哈希

Guava 中的一致性哈希

作者: hemiao3000 | 来源:发表于2020-07-04 21:04 被阅读0次

最近发现在Guava中有一个Hashing类简单实现了一个一致性哈希的算法。

它使用起来非常简单,里面有一个consistentHash()的静态方法:

// bucket 的范围在 0 ~ buckets 之间
int bucket = Hashing.consistentHash(id, buckets) 

传入数据主键id(分片片键)和集群中机器数量buckets,返回一个固定的数字,表示数据应当落在第几个机器上。

而这个方法内部实现也非常简单:

public static int consistentHash(long input, int buckets) {
    // 检查
    checkArgument(buckets > 0, "buckets must be positive: %s", buckets);
    // 利用内部的LCG算法实现,产生伪随机数
    LinearCongruentialGenerator generator = new LinearCongruentialGenerator(input);
    int candidate = 0;
    int next;

    // Jump from bucket to bucket until we go out of range
    while (true) {
        // generator.nextDouble() 产生伪随机数
        // 每次hash的循环中每一个的next的值总是会固定 :
        // 比如:
        //      hash 1 round 1 -> 9  hash 2 round 1 -> 9
        //      hash 1 round 2 -> 7  hash 2 round 2 -> 7
        //      hash 1 round 3 -> 2  hash 2 round 3 -> 2
        next = (int) ((candidate + 1) / generator.nextDouble());

        if (next >= 0 && next < buckets) {
            //  如果在 0 到 bucket 范围之外, 将这个next值赋值给candidate,重新计算
            candidate = next;
        } else {
            //  如果在 0 到 bucket 范围之内, 就返回这个 candidate 值,作为 input数据存储的槽
            return candidate;
        }
    }
}

// LCG伪随机数的算法实现,关于LCG的解释可以参考 http://en.wikipedia.org/wiki/Linear_congruential_generator
private static final class LinearCongruentialGenerator {
    private long state;

    public LinearCongruentialGenerator(long seed) {
        this.state = seed;
    }

    public double nextDouble() {
        state = 2862933555777941757L * state + 1;
        return ((double) ((int) (state >>> 33) + 1)) / (0x1.0p31);
    }
}

通过 Guava 的这个方法,我们就可以轻松地在项目中使用一致性哈希了。

相关文章

  • Guava 中的一致性哈希

    之前写过一篇博客分析了一致性哈希,最近发现在Guava中有一个Hashing类简单实现了一个一致性哈希的算法。 它...

  • Guava 中的一致性哈希

    最近发现在Guava中有一个Hashing类简单实现了一个一致性哈希的算法。 它使用起来非常简单,里面有一个con...

  • 《分布式技术原理与算法解析》学习笔记Day22

    哈希与一致性哈希 在分布式系统中,哈希和一致性哈希是数据索引或者数据分布的常见实现方式。 数据分布设计原则 在分布...

  • 一致性哈希和哈希槽对比

    背景 随着memcache和redis的出现,更多人认识到了一致性哈希。 一致性哈希用于解决分布式缓存系统中的数据...

  • 一致性哈希和哈希槽对比

    背景 随着memcache和redis的出现,更多人认识到了一致性哈希。 一致性哈希用于解决分布式缓存系统中的数据...

  • 一致性哈希算法

    一致性哈希算法

  • 一致性Hash算法

    一致性哈希算法

  • 一致性哈希 Go 语言版简单实现

    在分布式系统中,经常提到一致性哈希算法,那么,这个一致性哈希算法到底是干什么的?具体解决了什么问题呢?简单的回答就...

  • 一致性哈希算法(白话解析)

    在了解一致性哈希算法之前,最好先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容...

  • 白话“一致哈希”

    在了解一致性哈希算法之前,最好先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容...

网友评论

      本文标题:Guava 中的一致性哈希

      本文链接:https://www.haomeiwen.com/subject/rvjpqktx.html