Golang的一致性哈希实现

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

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

    [技术博客]iview组件样式踩坑记录 iview官方文档. 在本次项目开发中,前端项目主要使用vue框架+iview组件构建,其中iview组件在使用过程中遇到了许多官方文档中没有明确说明或是很难注 ...

  2. OO随笔之纠结的第二单元——多线程电梯

    综述 主要任务就是写一个电梯模拟器,读入每一个人的请求然后让电梯把他们送到想去的地方. 从第一次到第三次作业,三次的主要任务都是相同的,但是每次都增加了很多的细节,每次的难度都逐步增长,电梯复杂度和瞎 ...

  3. Vue | 指令实现自动翻译填充英文名功能

    背景:应用系统中存在多个创建实体表单,表单填写时,在填写中文名称后,要填写对应的英文名作为标识或数据库查询索引. 需求:填写中文名的同时,系统自动生成英文名并填充到表单中,辅助用户操作,节约操作时间. ...

  4. [刷题] PTA 6-11 求自定类型元素序列的中位数 (25分)

    采用希尔排序 1 #include <stdio.h> 2 3 #define MAXN 10 4 typedef float ElementType; 5 6 ElementType M ...

  5. [算法] O(n^2)排序算法的效率比较

    选择.插入排序 main.cpp 1 #include <iostream> 3 #include "SortTestHelper.h" 4 5 using names ...

  6. Ansible_管理事实(Fact)

    一.Ansible管理事实(fact) 1.Ansible事实描述 1️⃣:Ansible事实是Ansible在受管主机上自动检测到的变量 2️⃣:事实(fact)中包含有与主机相关的信息,可以像pl ...

  7. sersync 实时同步网站数据

    sersync同步实战 sersync是基于inotify和srync的二次开发,代码托管在github上面在rsync的客户端上安装,下载地址: https://raw.githubusercont ...

  8. KEIL-C下数组指针与指针数组实验

    http://blog.csdn.net/men_wen/article/details/52694069 第一个: 数组指针的小实验 用指针传递参数 结果:  第二个: 数组指针实验 定义一个指针 ...

  9. 统信UOS - 扩展系统盘

    一.开root权限,开终端 二.执行lsblk指令,查看磁盘情况 可以发现 / 路径 对应的是loop0,查阅可知loop设备就是一个文件,挂载为一个路径操作的,这就尴尬了,好好的分区不用,你干嘛这么 ...

  10. 根据swagger.json生成flutter model,暂无空安全支持

    一般的服务端类型都有泛型支持,对于flutter来说虽然也支持泛型,但是在序列化这里却始终存在问题,flutter不允许用反射,对于flutter项目的开发来说除了画页面,可能最烦人的就是跟服务端打交 ...