Golang的一致性哈希实现

一致性哈希的具体介绍,可以参考:http://www.cnblogs.com/haippy/archive/2011/12/10/2282943.html

 
 1 import (
2 "hash/crc32"
3 "sort"
4 "strconv"
5 "sync"
6 )
7 ​
8 const DEFAULT_REPLICAS = 100
9 type SortKeys []uint32
10 ​
11 func (sk SortKeys) Len() int {
12 return len(sk)
13 }
14 ​
15 func (sk SortKeys) Less(i, j int) bool {
16 return sk[i] < sk[j]
17 }
18 ​
19 func (sk SortKeys) Swap(i, j int) {
20 sk[i], sk[j] = sk[j], sk[i]
21 }
22 ​
23 type HashRing struct {
24 Nodes map[uint32]string
25 Keys SortKeys
26 sync.RWMutex
27 }
28 ​
29 func (hr *HashRing)New(nodes []string) {
30 if nodes == nil {
31 return
32 }
33 ​
34 hr.Nodes = make(map[uint32]string)
35 hr.Keys = SortKeys{}
36 for _, node := range(nodes) {
37 for i := 0; i < DEFAULT_REPLICAS; i++ {
38 str := node + strconv.Itoa(i)
39 hr.Nodes[hr.hashStr(str)] = node
40 hr.Keys = append(hr.Keys, hr.hashStr(str))
41 }
42 }
43 sort.Sort(hr.Keys)
44 }
45
46 func (hr *HashRing) hashStr(key string) uint32 {
47 return crc32.ChecksumIEEE([]byte(key))
48 }
49
50 func (hr *HashRing) GetNode(key string) string {
51 hr.RLock()
52 defer hr.RUnlock()
53 hash := hr.hashStr(key)
54 i := hr.get_position(hash)
55 return hr.Nodes[hr.Keys[i]]
56 }
57 ​
58 func (hr *HashRing) get_position(hash uint32) int {
59 i := sort.Search(len(hr.Keys), func(i int) bool {
60 return hr.Keys[i] >= hash})
61 ​
62 if i < len(hr.Keys) {
63 if i == len(hr.Keys) - 1 {
64 return 0
65 } else {
66 return i
67 }
68 } else {
69 return len(hr.Keys) - 1
70 }
71 }
72
73

Golang的一致性哈希实现的更多相关文章

  1. 一致性哈希算法和Go语言实现

    一致性哈希算法,当我第一次听到这个名字的时候,感觉特别高深.而它往往会和分布式系统相关,准确的说,是分布式缓存. 在Web服务中,缓存是介于数据库和服务端程序之间的一个东西.在网站的业务还不是很大的时 ...

  2. .net的一致性哈希实现

    最近在项目的微服务架构推进过程中,一个新的服务需要动态伸缩的弹性部署,所有容器化示例组成一个大的工作集群,以分布式处理的方式来完成一项工作,在集群中所有节点的任务分配过程中,由于集群工作节点需要动态增 ...

  3. 一致性哈希算法与Java实现

    原文:http://blog.csdn.net/wuhuan_wp/article/details/7010071 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具 ...

  4. 五分钟理解一致性哈希算法(consistent hashing)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法 ...

  5. 每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179     一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...

  6. memcache 的内存管理介绍和 php实现memcache一致性哈希分布式算法

    1 网络IO模型 安装memcached需要先安装libevent Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描 ...

  7. 一致性哈希算法以及其PHP实现

    在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括:  轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法(Respons ...

  8. Java_一致性哈希算法与Java实现

    摘自:http://blog.csdn.net/wuhuan_wp/article/details/7010071 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具 ...

  9. Memcached 笔记与总结(8)Memcached 的普通哈希分布算法和一致性哈希分布算法命中率对比

    准备工作: ① 配置文件 config.php ② 封装 Memcached 类 hash.class.php,包含普通哈希算法(取模)和一致性哈希算法 ③ 初始化 Memcached 节点信息 in ...

随机推荐

  1. 团队任务拆解$\alpha$

    项目 内容 班级:2020春季计算机学院软件工程(罗杰 任健) 博客园班级博客 作业要求 团队任务拆解 我们在这个课程中的目标 提升团队管理及合作能力,开发一项满意的工程项目 这个作业对我们实现目标的 ...

  2. mitrproxy抓包微信小程序

    mitmproxy mitmproxy is a set of tools that provide an interactive, SSL/TLS-capable intercepting prox ...

  3. [Web] 计算机网络课程(一)

    局域网 覆盖范围小,自己花钱买设备,自己单位维护 线长不超过100米,带宽固定(10M 100M 1000M) 星形结构,上层交换机口少,但每个口带宽高 广域网 距离远 如在家通过ADSL拨号上网,或 ...

  4. Installing SFTP/SSH Server on Windows using OpenSSH

    Installing SFTP/SSH Server 1. On Windows 10 version 1803 and newer In Settings app, go to Apps > ...

  5. ansible常用方法

    1.安装ansible yum -y install ansible 2.主机清单推荐格式 [root@controller ~]# vi /etc/ansible/hosts [controller ...

  6. Linux服务之nginx服务篇三(反向代理、负载均衡)

    一.Nginx实现反向代理 概念 反向代理:在收到客户端请求之后,会修目标IP地址和端口 正向代理:在收到客户端请求之后,会修源IP地址和端口 上游服务器:代理服务器后端的哪些真正给客户端提供服务的节 ...

  7. 解决Windows路径太长的目录以及文件名超长删除的问题

    因Windows文件夹有长度限制,在路径太深,长度达到600多个字符时,删除文件时出现报错"源文件名长度大于文件系统支持的长度.请尝试将其移动到具有较短路径名称的位置,或者在执行此操作前尝试 ...

  8. 电压笔DIY

    电压逻辑笔 http://www.cirmall.com/circuit/2279/detail?3#/details http://www.cirmall.com/circuit/7543/CD45 ...

  9. Java注解类型(@Annotation)

    简述 注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类.而我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象$Proxy1.通过代理对象调 ...

  10. Selenium3自动化测试【18】XPath定位元素(2)

    层级与属性结合定位 如果被定为的元素,无法通过自身属性来唯一标识自己,此时可以考虑借助上级元素来定位自己.举生活中的例子,一个婴儿刚出生,还没有姓名与身份证号,此时给婴儿进行检查时往往会标注为&quo ...