引言:为什么需要全局ID生成器?
在分布式系统中,全局唯一 ID 的生成是一个看似简单却至关重要的问题。无论是电商订单号、用户 ID,还是支付交易号,都需要一个全局唯一且有序的 ID 来标识每个业务操作。如果 ID 重复或混乱,将会导致严重的数据混乱甚至系统崩溃。
本文将深入探讨 全局 ID 生成器 的常见实现方法,包括它们的原理、实现代码、优缺点及适用场景。此外,我们还会整理一些企业在面试中可能问到的高频问题,帮助你在职场竞争中脱颖而出。
正文:全局 ID 生成器的常见方法与实现
一、自增ID(Auto-Increment ID)
1. 原理与实现
自增 ID 是数据库中最常见的 ID 生成方式,通过 AUTO_INCREMENT
实现。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL
);
2. 优缺点
- 优点:简单易用,天然有序。
- 缺点:
- 分布式场景下无法保证唯一性。
- 高并发场景下性能瓶颈明显。
3. 适用场景
适用于单机数据库的小型系统。
二、UUID(通用唯一识别码)
1. 原理与实现
UUID 是一个 128 位的唯一标识符,通常表示为 32 个十六进制字符。
public class UUIDGenerator {
public static String generateUUID() {
return UUID.randomUUID().toString();
}
}
2. 优缺点
- 优点:全局唯一,无中心化。
- 缺点:
- 字符串形式存储占用空间大。
- 不具备有序性。
3. 适用场景
适用于需要全局唯一但对顺序无要求的场景,如文件存储、日志系统。
三、Snowflake(雪花算法)
1. 原理与实现
Snowflake 是 Twitter 开源的一种分布式 ID 生成算法,生成的 ID 由三部分组成:
- 1 位符号位(固定为 0)。
- 41 位时间戳(精确到毫秒)。
- 10 位数据中心 ID。
- 12 位机器 ID。
- 16 位序列号。
public class SnowflakeIdGenerator {
private static final long WORKER_ID_BITS = 10L;
private static final long DATACENTER_ID_BITS = 10L;
pr