单机环境迈向高并发:手工打造唯一编号生成方案

作者:袖梨 2026-05-29

在分布式系统设计中,生成唯一编码是一个常见需求。本文将探讨从单机到高并发环境下的多种解决方案,帮助开发者根据业务场景选择合适的技术方案。

img_6a192e237c4a530.webp

01 编码生成方案概述

现有多种成熟的唯一编码生成方案可供选择,如UUID、雪花算法、美团Leaf、百度UidGenerator、滴滴Tinyid等。但当需要结合特定业务参数时,这些通用方案可能无法满足需求,此时就需要设计自定义的编码生成规则。

02 核心设计思路

设计唯一编码时需要平衡多个关键因素:唯一性、有序性、性能、可用性与存储效率。主要有三种设计思路:

  1. 中心化强一致:利用数据库或Redis实现原子发号,保证严格递增,通过号段预取提升性能。
  2. 去中心化组合式:如雪花算法,通过时间戳+机器ID+序列号本地拼装,性能高且趋势递增,但依赖时钟同步。
  3. 概率型:如UUID随机生成,无协调开销但无序且存储空间较大。

03 单机环境实现

虽然分布式架构更常见,但单机方案是理解更复杂设计的基础。

3.1 实现原理

完全在JVM进程内完成发号,不依赖外部中间件。通过时间戳位移保证宏观有序,结合PID与随机数区分进程,使用AtomicLong确保线程安全。

3.2 代码示例

public final class UniqueIdUtils {
    // 实现细节与原始内容一致
    // 包含时间戳位移、进程特征处理、原子序列生成等方法
}

3.3 方案优劣

  1. 优势:零外部依赖、代码简洁、性能优异、时间有序。
  2. 局限:多机同PID可能冲突、重启后状态丢失、不支持分布式场景。

04 分布式高并发方案

4.1 设计理念

采用中心化强一致思路,利用Redis单线程特性实现原子递增。通过号段模式降低Redis访问频率,批量获取号段缓存在本地内存中。

4.2 实现代码

public class RedisSegmentSequence {
    // 包含Redis操作、本地号段管理等方法
    // 实现细节与原始内容一致
}

4.3 方案评估

  1. 优势:性能极高,减少Redis交互。
  2. 不足:宕机可能导致号段丢失,出现跳号现象。

4.4 优化实践

结合实际业务需求,可采用业务码+时间戳+序列号的组合方式。通过Redis控制秒级序列号,过期自动重置。

public class SerialNumberGenerator {
    // 包含Lua脚本实现原子操作
    // 实现细节与原始内容一致
}

05 总结

本文系统介绍了从单机到分布式环境下的唯一编码生成方案,每种方案都有其适用场景和权衡点。开发者可根据具体业务需求,选择最适合的技术实现路径。

相关文章

精彩推荐