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. Linux上的Shebang符号(#!)

    使用Linux或者unix系统的同学可能都对#!这个符号并不陌生,但是你真的了解它吗? 本文了将给你简单介绍一下Shebang("#!")这个符号. 首先,这个符号(#!)的名称, ...

  2. OO_Unit1_表达式求导

    CSDN链接 一.第一次作业 1.需求分析 简单多项式导函数 带符号整数 支持前导0的带符号整数,符号可省略,如: +02.-16.19260817等. 幂函数 一般形式 由自变量x和指数组成,指数为 ...

  3. .NetCore&#183;集成Ocelot组件之完全解决方案

    阅文时长 | 11.04分钟 字数统计 | 17672.8字符 主要内容 | 1.前言.环境说明.预备知识 2.Ocelot基本使用 3.Ocelot功能挖掘 4.Ocelot集成其他组件 5.避坑指 ...

  4. goland:调试

    弹出框f9 会跳转到下一个断点

  5. [刷题] 79 Word Search

    要求 给定一个二维平面的字母和一个单词,从一个字母出发,横向或纵向连接二维平面上的其他字母 同一位置的字母只能使用一次 示例 board = [   ['A','B','C','E'],   ['S' ...

  6. gdb调试coredump(使用篇)

    gdb调试coredump(使用篇) 看到一个非常好的介绍coredump的文章,做个记录, 参考链接: https://blog.csdn.net/sunxiaopengsun/article/de ...

  7. 联想RD350板载RAID110i,安装CentOS 7 不识别RAID设备

    联想RD350板载RAID110i,安装CentOS 7 不识别RAID设备   情况如题所述. 1. 确认BIOS中 Boot mode为[UEFI]或者[AUTO] 2. 确认BIOS中 Stor ...

  8. Rust trait

    Rust trait Rust中的trait类似于Java中的接口,定义了一组可以被类型选择实现的"契约"或共享行为,. 特征定义: trait Playable{ fn play ...

  9. Linux进阶之综合练习

    综合练习: 1.准备2台centos7系统的服务器,远程互相免密登录,以下所有题目过程中开启防火墙 2.给1号机和2号机使用光盘搭建本地yum源(永久生效) 3.给服务器1添加2块硬盘,1块1GB,1 ...

  10. Django中的中英文切换

    setting.py文件中 其中 zh-Hans是简体中文 zh-Hant是繁体中文 所以更改setttings.py 下 LANGUAGE_CODE = 'zh-Hans'即可 # 英文 LANGU ...