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

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 教程来源本节详解分布式系统两大核心算法:一致性哈希(解决缓存扩缩容时数据重映射问题,通过哈希环+虚拟节点提升均衡性)与雪花算法(生成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/

相关文章
|
22天前
|
JavaScript Java 测试技术
软件开发进阶技能之代码规范与测试(一)
教程来源本文系统讲解代码规范(命名、格式、注释、设计原则、代码审查)与软件测试(单元/集成测试、TDD、Mock、覆盖率、CI)两大核心实践,强调规范是协作契约、测试是质量护栏,助力开发者写出可读、可维护、可演进的高质量代码。
|
21天前
|
缓存 Devops Java
软件开发进阶技能之 DevOps 工程体系(二)
本文系统讲解CI/CD全流程:涵盖CI流水线核心阶段(检出、缓存、测试、构建、镜像、集成测试等),GitHub Actions与Jenkins实战示例;CD/CD部署策略(环境链、门禁、蓝绿/金丝雀)、ArgoCD GitOps实践及数据库迁移(Flyway)方案,助力高效可靠交付。
|
4月前
|
XML 前端开发 开发者
CSS学习知识点大全(一)
教程来源 https://app-a7illrp9pngh.appmiaoda.com/ 梳理CSS核心知识:从基础语法、四大引入方式,到选择器(基础/组合/属性/伪类/伪元素)及优先级规则;详解盒模型(标准/怪异)、属性设置与外边距折叠。助力新手构建完整体系,也为开发者提供深度参考。
|
22天前
|
消息中间件 NoSQL 中间件
软件开发进阶技能之分布式与高并发(二)
教程来源 https://oplhc.cn/ 消息队列(MQ)是分布式系统核心中间件,以异步通信实现服务解耦、流量削峰与最终一致性。支持可靠投递、幂等消费与死信处理,广泛应用于秒杀、日志收集等高并发场景。
|
22天前
|
JSON Prometheus 监控
程序员进阶工程师必备技能之工程化与研发效率建设(五)
教程来源 https://aescc.cn/ 本节构建了完整的可观测性与效能度量体系:通过结构化JSON日志(含request_id/trace_id上下文)、Prometheus指标采集(HTTP/DB/业务维度)及OpenTelemetry分布式追踪;并集成DORA四大核心指标、开发者体验度量与可视化效能仪表板,实现从系统到团队的全栈监控与持续改进闭环。
|
5月前
|
人工智能 API 开发者
终于等到!阿里云Coding Plan上线Qwen3.5/GLM-5/MiniMax/Kimi,一键自由切换
阿里云Coding Plan上线Qwen3.5、GLM-5、MiniMax M2.5、Kimi K2.5四大顶流开源模型,支持Qwen Code等工具一键切换。Lite/Pro套餐首月仅7.9/39.9元,享高稳定、高Token额度服务,助力高效编程与智能体开发。(239字)
1439 3
|
22天前
|
程序员 Windows
程序员必备的十大技能(进阶版)之网络与高并发原理(二)
教程来源 http://hllft.cn/ Reactor与Proactor是高性能I/O的两大核心模型:Reactor基于同步非阻塞+事件就绪通知(如epoll),由用户线程主动读写;Proactor基于异步I/O+操作完成通知(如IOCP/AIO),内核代为完成数据搬运。二者分别支撑Netty与Windows服务器等高并发架构。
|
2月前
|
Linux 程序员 网络安全
初级程序员必备的十大技能之基础 Linux 命令(一)
教程来源 https://qcycj.cn/ 本文系统讲解程序员必备的Linux核心命令,涵盖文件操作、文本处理、权限管理、进程与网络工具等,结合原理、参数详解及实战案例,助你高效部署、排查与运维——无论用Windows还是macOS,Linux都是程序员不可或缺的“第二操作系统”。
|
22天前
|
数据采集 人工智能 JSON
基于浏览器请求录制与AI代码生成的E2E接口自动化测试实践
以阿里云DataWorks为例,介绍如何通过浏览器录制插件捕获真实请求数据,结合AI编程工具自动生成接口封装与测试用例,解决复杂平台产品自动化测试中接口多、参数杂、数据流深的核心难题。
|
22天前
|
JavaScript 安全 Java
软件开发进阶技能之编程语言深度运用(一)
教程来源 http://xbivx.cn/ 本文聚焦编程进阶核心——从“会用”到“用好”的跃迁。通过深度解析类型系统(泛型、类型推断、ADT/模式匹配)、内存、并发、函数式等共性机制,结合Java/Python/TS/Go实战示例,助开发者写出更安全、高效、优雅的代码。
124 0

热门文章

最新文章