【golang】分布式缓存 - 一致性哈希算法

前言

最近两个月去博客园写文章了,好久没有更新博客了。现在把之前写的文章搬运一下~

正文

我们先来想下一致性哈希算法的数据结构含有哪些内容:

1.map 用来存储虚拟节点对应的真实节点,是一个映射表

2.hash 哈希函数

3.key 哈希环,存储所有虚拟节点

4.replicas 虚拟节点的倍数

了解过一致性哈希算法的朋友,应该是能够理解为什么要有上面的内容,下面我们用代码实现下:

type Hash func([]byte) uint32
type Map struct {
    hash    Hash  // hash算法
    key     []int // hash环
    replicas int  // 虚拟节点的数量
    m      map[int]string // 虚拟节点和真实节点的映射表
}

下面,我们实现获取节点的方法:

将key经过hash运算,在哈希环上顺时针找到第一个节点,存入

func (m *Map) Get(key string) string {
    hash := int(m.hash([]byte(key)))   // 获取key对应的hash值

    idx := sort.Search(len(m.key), func(i int) bool { // 顺时针找到第一个虚拟节点
        return m.key[i] >= hash
    })
    return m.m[m.key[idx % len(m.key)]]  //返回对应的真实节点:记得对哈希环取余
}

添加节点的方法:

func (m *Map) Add(key ...string)  {
    for _,realKey := range key{
        for i := 0; i < m.replicas; i++ {
            hash := int(m.hash([]byte(strconv.Itoa(i)+realKey)))  // 真实节点对应的虚拟节点
            m.key = append(m.key,hash)  // 添加到换上
            m.m[hash] = realKey       // 添加到映射表上
        }
    }
    sort.Ints(m.key)    // 递增排序,方便顺时针查找
}

以上就是一致性哈希的实现方法,也挺好理解的。记录下~

| 不骄不躁,保持学习

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值