在 Java 应用开发中,ID 生成是一个看似简单却至关重要的基础组件。不同的业务场景、系统架构对 ID 生成策略有着截然不同的要求。本文将系统梳理 Java 中常见的 ID 生成方案,从单机到分布式,从简单到复杂,帮助你在实际项目中做出最合适的技术选型。
一、数据库自增 ID
1.1 核心原理
数据库自增 ID 是最传统也是最简单的 ID 生成方式,通过数据库的 AUTO_INCREMENT(MySQL)或 SEQUENCE(Oracle/PostgreSQL)机制实现。
- MySQL 示例:
CREATE TABLE user ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL );
- PostgreSQL 示例:
CREATE SEQUENCE user_id_seq START 1 INCREMENT 1;
CREATE TABLE user ( id BIGINT DEFAULT nextval('user_id_seq') PRIMARY KEY, name VARCHAR(50) NOT NULL );
1.2 优缺点分析
优点:
- 简单可靠:无需额外开发,数据库原生支持
- 绝对递增:保证 ID 单调递增,便于排序和分页
- 性能良好:单表插入性能可达数万 TPS
缺点:
- 分库分表困难:需要改造为分布式 ID 方案
- 业务暴露:ID 连续递增,容易暴露业务量
- 单点瓶颈:高并发下数据库可能成为性能瓶颈
- 迁移困难:不同数据库实现差异大
1.3 适用场景
- 单机应用或小规模系统
- 数据量不大,无需分库分表的场景
- 对 ID 连续性有强要求的业务
二、UUID(通用唯一标识符)
2.1 核心原理
UUID 是一个 128 位的全局唯一标识符,标准格式包含 32 个十六进制数字,以连字符分隔的五组形式显示,例如:550e8400-e29b-41d4-a716-446655440000。
Java 实现:
import java.util.UUID;
public class {
String {
UUID.randomUUID().toString();
}
String {
UUID.randomUUID().toString().replaceAll(, );
}
}


