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

前言


  之前也了解到过一致性哈希算法,但是没有用go实现过,刚好最近看GeeCache,动手实现下一致性哈希算法


正文:


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


  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)
}

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


相关阅读

  • emeditor 配置 可以编辑 hex 16进制文件

    emeditor 配置 可以编辑 hex 16进制文件

    EmEditor 本身支持通过插件/功能配置实现 Hex 编辑功能。 实现方法:使用 EmEditor 的 Hex 模式EmEditor 内置了 Hex 编辑功能,无需安装第三方插件,只需简单配置即可启用,以下是完整的操作步骤: 步骤...

    2026.02.03 20:59:22作者:wintopTags:emeditorhex
  • RTX 3060(12GB显存)总结 PDF内容的智能大模型架构方案

    RTX 3060(12GB显存)总结 PDF内容的智能大模型架构方案

    显卡:RTX 3060(12GB显存)功能需求:“PDF文本总结”。下面是最优、效率最高的模型,同时明确部署方式和调优技巧,让总结速度和效果达到最佳平衡。 核心结论:最优模型选择对你的场景来说,Qwen2.5-7B-Instruct(通义...

    2026.01.22 20:04:09作者:wintop
  • python 多线程任务(下载)水平扩展线程

    python 多线程任务(下载)水平扩展线程

    方案架构说明这个方案由两个主要组件构成:任务分发器 (TaskDistributor)从 MySQL 数据库中获取待下载的文件将下载任务放入 Redis 队列标记文件状态为 "处理中"工作节点 (DownloadWork...

    2025.06.08 22:01:56作者:wintopTags:python
  • Python库实现PDF转HTML方法,可以提取目录TOC

    Python库实现PDF转HTML方法,可以提取目录TOC

    在Python中,要识别PDF中的目录(Table of Contents, TOC),通常有两种场景:直接提取PDF内置的书签(Bookmarks):如果PDF本身带有目录书签(例如电子书、技术文档),可以直接提取。自动分析文本结构推断目...

    2025.03.31 22:14:54作者:wintopTags:pythonpdf
  • grok beta 模型转发php版本,测试通过

    grok beta 模型转发php版本,测试通过

    <?php // 禁用输出缓冲 while (ob_get_level()) {     ob_end_clean(); } ob_implicit_fl...

    2024.11.26 20:32:33作者:wintop
  • FastAdmin如何在表单提交验证时不验证隐藏的元素

    FastAdmin如何在表单提交验证时不验证隐藏的元素

    在FastAdmin中使用的是nice-validator验证器,默认是验证表单中所有添加有验证规则的元素。如何在表单提交时不验证隐藏的元素呢?在nice-validator的选项中有一个ignore的选项。我们配置该值即可。首先打开控制器...

    2024.03.13 13:50:21作者:wintopTags:FastAdmin表单
  • php远程开机,远程唤醒(Wake-on-LAN)局域网电脑代码

    php远程开机,远程唤醒(Wake-on-LAN)局域网电脑代码

    首先要局域网电脑IP为固定IP,这样可以减少获取IP地址的步骤。要使用 PHP 来实现局域网中的远程唤醒(Wake-on-LAN),您可以通过以下步骤来完成:首先,确保您的服务器上已安装 PHP,并且具备发送网络数据包的权限。获取目标计算机...

    2024.03.10 11:33:33作者:wintopTags:php远程唤醒Wake-on-LAN局域网
  • Mysql 联合查询 主表和详细表查询方案

    Mysql 联合查询 主表和详细表查询方案

    mysql 多表联合查询示例:表aindex 为主表:CREATE TABLE `aindex` (  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,  `name` cha...

    2024.02.02 17:41:12作者:wintop

添加新评论