软件开发进阶技能之分布式与高并发(四)

简介: 教程来源本节详解分布式系统两大核心算法:一致性哈希(解决缓存扩缩容时数据重映射问题,通过哈希环+虚拟节点提升均衡性)与雪花算法(生成64位全局唯一、趋势递增ID)。附Java精简实现及Redis Cluster、Cassandra等实际应用对比。

第九部分:一致性哈希 —— 解决分布式缓存扩缩容问题

在分布式缓存(如 Redis Cluster)或负载均衡中,当节点数量变化时,传统的哈希取模会导致大量 key 的映射位置改变,引发缓存雪崩。一致性哈希算法可以在节点增减时只影响少量 key。

9.1 基本原理
将哈希值空间组织成一个大小为 2^32 的圆环。将节点(如 Redis 实例)的 IP 哈希到环上,将 key 也哈希到环上,然后顺时针找到第一个节点。

虚拟节点:每个物理节点在环上映射多个虚拟节点,使数据分布更均匀,且节点变化时影响范围更平均。

9.2 代码实现简化版

import java.util.*;

public class ConsistentHash {
    private final SortedMap<Integer, String> circle = new TreeMap<>();
    private final int virtualNodesNum = 150;

    public void addNode(String node) {
        for (int i = 0; i < virtualNodesNum; i++) {
            int hash = (node + "#" + i).hashCode();
            circle.put(hash, node);
        }
    }

    public void removeNode(String node) {
        for (int i = 0; i < virtualNodesNum; i++) {
            int hash = (node + "#" + i).hashCode();
            circle.remove(hash);
        }
    }

    public String getNode(String key) {
        if (circle.isEmpty()) return null;
        int hash = key.hashCode();
        SortedMap<Integer, String> tailMap = circle.tailMap(hash);
        Integer nodeHash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey();
        return circle.get(nodeHash);
    }
}

实际应用:Redis Cluster 使用哈希槽(16384 个槽)而不是一致性哈希,但原理类似。分布式数据存储(如 Cassandra、Amazon DynamoDB)广泛使用一致性哈希。

第十部分:分布式 ID 生成 —— 确保全局唯一且趋势递增

在分库分表环境下,数据库自增 ID 无法保证全局唯一。需要一种分布式 ID 生成器。

10.1 常见方案对比
image.png
10.2 雪花算法详解
雪花算法生成 64 位 Long 型 ID,结构如下:

0 | 41位时间戳 | 10位机器ID | 12位序列号

1 位符号位,固定 0。

41 位时间戳(毫秒级),可支持 69 年。

10 位机器 ID(最多 1024 个节点)。

12 位序列号,同一毫秒内可生成 4096 个不同 ID。

Java 实现片段:

public class SnowflakeIdGenerator {
    private final long twepoch = 1288834974657L; // 起始时间戳
    private final long workerIdBits = 10L;
    private final long sequenceBits = 12L;
    private final long maxWorkerId = ~(-1L << workerIdBits);
    private final long workerId;
    private long sequence = 0L;
    private long lastTimestamp = -1L;

    public SnowflakeIdGenerator(long workerId) {
        if (workerId > maxWorkerId || workerId < 0) throw new IllegalArgumentException();
        this.workerId = workerId;
    }

    public synchronized long nextId() {
        long timestamp = System.currentTimeMillis();
        if (timestamp < lastTimestamp) {
            // 时钟回拨处理:等待或抛出异常
            long offset = lastTimestamp - timestamp;
            if (offset <= 5) {
                try { Thread.sleep(offset << 1); } catch (Exception e) {}
                timestamp = System.currentTimeMillis();
            } else throw new RuntimeException("Clock moved backwards");
        }
        if (timestamp == lastTimestamp) {
            sequence = (sequence + 1) & ((1 << sequenceBits) - 1);
            if (sequence == 0) {
                timestamp = tilNextMillis(lastTimestamp);
            }
        } else {
            sequence = 0;
        }
        lastTimestamp = timestamp;
        return ((timestamp - twepoch) << (workerIdBits + sequenceBits))
                | (workerId << sequenceBits)
                | sequence;
    }

    private long tilNextMillis(long lastTs) {
        long ts = System.currentTimeMillis();
        while (ts <= lastTs) ts = System.currentTimeMillis();
        return ts;
    }
}

拓展:百度开源的 UidGenerator、美团 Leaf 提供了更健壮的方案,支持时钟回拨自动补偿。
https://htnus.cn/

相关文章
|
18天前
|
人工智能 自然语言处理 文字识别
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
Qwen3.7-Max是阿里云百炼面向智能体时代推出的新一代旗舰模型,对标GPT-5.5、Claude Opus 4.7等闭源旗舰。该模型支持百万级token上下文窗口,具备顶级推理能力、多模态搜索与视觉理解增强、流式输出低延迟响应等核心优势,覆盖编程、办公、长周期自主执行等复杂场景。同时支持OpenAI接口兼容,便于系统快速迁移。用户可通过Token Plan团队或节省计划等订阅方式灵活调用,适合企业级高要求场景使用。
6750 30
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
|
3天前
|
数据采集 人工智能 前端开发
让 Coding Agent 从黑盒到透明:阿里云 Agent 观测审计数据采集实践
AI Agent 规模化落地带来执行黑盒、行为难追溯、成本难度量三大难题。阿里云基于 OTel 标准,面向 Coding Agent、个人通用助理和框架型 Agent,推出 LoongSuite Pilot、插件及探针等无侵入采集方案,让 Agent 实现可看见、可分析、可审计、可治理。
603 138
|
3天前
|
人工智能 弹性计算 运维
阿里云发布堡垒机智能运维Agent,运维交互进入自然语言新时代
支持自然语言运维,提升效率与安全双保障。
1144 0
|
10天前
|
人工智能 安全 定位技术
CodeGraph深度解析 让Claude Code工具调用直降七成的核心原理与实操教程
如今以Claude Code为代表的AI编程智能体已经成为开发者日常编码、项目重构、漏洞修复的必备工具。但在长期使用过程中,几乎所有开发者都会遇到同一个明显痛点:AI虽然具备强大的代码生成与分析能力,却常常陷入盲目探索的循环中。
1159 1
|
13天前
|
存储 定位技术 数据库
CodeGraph 如何让 Claude Code减少 7 成工具调用?
CodeGraph 为 Coding Agent 提供本地代码知识图谱,把函数、类、调用链和框架路由提前整理成“项目地图”,减少盲目搜索和文件读取。它不是新 Agent,而是上下文基础设施,让 Agent 更快找到正确代码路径,平均减少 7 成工具调用。
1269 3
|
10天前
|
人工智能 弹性计算 安全
阿里云618活动时间、活动入口、优惠活动详细解读
2026年阿里云618创新加速季已全面开启,作为年度力度最大的云产品促销活动,本次大促覆盖轻量应用服务器、ECS云服务器、GPU云服务器、数据库、AI算力、安全服务、CDN等全品类产品,推出5亿元算力补贴、新用户限时秒杀、普惠满减、企业专享、免费试用、云大使返佣等多重福利,个人开发者、中小企业、AI团队均可享受专属低价。本文将系统梳理2026年阿里云618活动的完整时间节点、官方参与入口、各类优惠细则、使用规则、热门产品推荐及实操代码,帮助用户精准参与、高效省钱,以最低成本完成上云部署。
949 5
|
9天前
|
人工智能 自然语言处理 安全
Vibe Coding 实战:别盲目跟风,先分清 vibe coding 适合什么场景
本文系统总结vibe coding实战经验:明确其适用场景(原型、小工具、标准化模块),剖析5步落地流程(场景判定→结构化提示词→目录初始化→分模块生成→自动化校验),指出四大常见误区,并推荐适配工具Trae。强调“场景匹配+规则前置”是提效关键,避免盲目套用。
789 1