一致性哈希consistent

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_26019075/article/details/80509991

Go一致性哈希package consistent

import “stathat.com/c/consistent”
github地址stathat/consistent

Type Consistent

Consistent是这个包的结构体,记录哈希环的各项信息。

type Consistent struct {  
    circle           map[uint32]string //环,保存元素
    members          map[string]bool      
    sortedHashes     uints
    NumberOfReplicas int               //哈希环节点个数
    count            int64
    scratch          [64]byte
    sync.RWMutex
}

func New

func New() *Consistent

创建一个新的Consistent结构体,并对其进行初始化。New()函数会将NumberOfReplicas属性初始化为20。

func (*Consistent) Add

func (c *Consistent) Add(elt string)

往哈希环中添加一个元素elt。首先计算elt在环中的下标,然后将其添加到circle数组对应的位置,同时设置c.members[elt] = true。

func (*Consistent) Get

func (c *Consistent) Get(name string) (string, error)

根据传入的name来获取对应的元素(elt)。

func (*Consistent) Remove

func (c *Consistent) Remove(elt string)

删除一个元素。

一个例子

package main

import (
    "fmt"
    "stathat.com/c/consistent"
)

func main() {
    cons := consistent.New()
    cons.Add("cacheA")
    cons.Add("cacheB")
    cons.Add("cacheC")

    server1, err := cons.Get("user_1")
    server2, err := cons.Get("user_2")
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println("server1:", server1) //输出 server1: cacheC
    fmt.Println("server2:", server2) //输出 server2: cacheA

    fmt.Println()

    //user_1在cacheA上,把cacheA删掉后看下效果
    cons.Remove("cacheA")
    server1, err = cons.Get("user_1")
    server2, err = cons.Get("user_2")
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println("server1:", server1) //输出 server1: cacheC,和删除之前一样,在同一个server上
    fmt.Println("server2:", server2) //输出 server2: cacheB,换到另一个server了
}

输出结果:
server1: cacheC
server2: cacheA

server1: cacheC
server2: cacheB

可以看到删除chcheA以后,user_2对应的server由cacheA换到cacheB了,而server1没有改变。

展开阅读全文

没有更多推荐了,返回首页