终极指南:如何用百度UidGenerator生成高性能分布式唯一ID?10分钟上手教程 🚀
【免费下载链接】uid-generator UniqueID generator 项目地址: https://gitcode.com/gh_mirrors/ui/uid-generator
在分布式系统中,生成全局唯一且高性能的ID是每个开发者都会遇到的挑战。百度开源的UidGenerator正是解决这一难题的利器!它基于Snowflake算法优化,单实例每秒可生成600万+ 唯一ID,完美适配Docker等虚拟化环境,还能避免时钟回拨问题。无论是数据库主键、订单编号还是消息追踪,UidGenerator都能轻松应对。
🌟 什么是UidGenerator?核心优势解析
UidGenerator是Java实现的分布式唯一ID生成器,基于Twitter Snowflake算法扩展,专为高并发场景设计。它通过动态WorkId分配、预缓存RingBuffer和无锁化设计三大核心技术,实现了超高吞吐量与可靠性的平衡。
✨ 四大核心特性
- 极致性能:单实例600万QPS,远超传统数据库自增ID
- 去中心化:无需中心化协调服务,通过数据库自动分配WorkerId
- 防时钟回拨:智能处理服务器时钟异常,杜绝ID重复
- 灵活配置:支持自定义时间位、机器位和序列号位数,适配不同场景
🔍 深入理解UidGenerator的实现原理
1. Snowflake算法基础:ID的构成秘密
UidGenerator生成的64位ID包含四个部分:

Snowflake算法结构示意图:1位符号位 + 时间位 + 工作节点位 + 序列号位
- 符号位(1bit):固定为0,确保ID为正数
- 时间位(28-32bit):记录相对于自定义纪元的秒数差,支持最长68年使用
- 工作节点位(21-27bit):标识不同机器/进程,默认支持400万+节点
- 序列号位(9-13bit):同一秒内的自增序列,默认支持8192个/秒
2. CachedUidGenerator:高性能的秘密武器
CachedUidGenerator通过RingBuffer缓存和预生成机制将性能推向极致。环形缓冲区就像ID的"蓄水池",提前生成并缓存一批ID,当消费到阈值时自动补充。

RingBuffer工作原理:Tail指针生成ID,Cursor指针消费ID,双指针实现无锁并发
🔧 关键优化技术
- 双环形缓冲区:一个存储ID,一个标记状态,实现高效读写分离
- 缓存行填充:解决CPU缓存伪共享问题,提升并发性能

缓存行填充技术:通过Padding消除RingBuffer的伪共享问题
🚀 快速上手:10分钟集成UidGenerator
环境准备
- JDK 8+
- MySQL(用于WorkerId分配)
- Maven 3.3+
Step 1:克隆项目代码
git clone https://gitcode.com/gh_mirrors/ui/uid-generator
cd uid-generator
Step 2:创建数据库表
执行脚本创建Worker节点表(位于src/main/scripts/WORKER_NODE.sql):
CREATE TABLE WORKER_NODE (
ID BIGINT NOT NULL AUTO_INCREMENT COMMENT 'auto increment id',
HOST_NAME VARCHAR(64) NOT NULL COMMENT 'host name',
PORT VARCHAR(64) NOT NULL COMMENT 'port',
TYPE INT NOT NULL COMMENT 'node type: ACTUAL or CONTAINER',
LAUNCH_DATE DATE NOT NULL COMMENT 'launch date',
MODIFIED TIMESTAMP NOT NULL COMMENT 'modified time',
CREATED TIMESTAMP NOT NULL COMMENT 'created time',
PRIMARY KEY(ID)
) ENGINE = INNODB COMMENT='DB WorkerID Assigner for UID Generator';
Step 3:Spring配置(以CachedUidGenerator为例)
<bean id="cachedUidGenerator" class="com.baidu.fsg.uid.impl.CachedUidGenerator">
<property name="workerIdAssigner" ref="disposableWorkerIdAssigner"/>
<!-- 自定义位分配 -->
<property name="timeBits" value="31"/>
<property name="workerBits" value="23"/>
<property name="seqBits" value="9"/>
<!-- 缓冲区配置 -->
<property name="boostPower" value="3"/> <!-- 缓冲区大小 2^3=8倍扩容 -->
<property name="paddingFactor" value="50"/> <!-- 剩余50%时自动填充 -->
</bean>
<bean id="disposableWorkerIdAssigner" class="com.baidu.fsg.uid.worker.DisposableWorkerIdAssigner"/>
Step 4:生成第一个ID
@Resource
private UidGenerator uidGenerator;
@Test
public void testGenerate() {
long uid = uidGenerator.getUID();
System.out.println("生成的UID: " + uid);
// 解析ID
System.out.println("解析结果: " + uidGenerator.parseUID(uid));
}
输出示例:
{
"UID": "180363646902239241",
"parsed": {
"timestamp": "2023-10-26 11:16:58",
"workerId": "4",
"sequence": "9"
}
}
⚡ 性能调优指南:让你的ID生成器飞起来
1. 位分配策略
根据业务需求调整时间位、机器位和序列号位:
- 长期项目:增加
timeBits(如31bit=68年),减少seqBits - 高并发场景:增加
seqBits(如13bit=8192/秒),减少workerBits - 频繁重启场景:增加
workerBits,支持更多WorkerId分配
2. RingBuffer优化
- 缓冲区大小:通过
boostPower调整(默认3=8倍序列号位容量) - 填充策略:
paddingFactor设置预填充阈值(默认50%) - 定时填充:配置
scheduleInterval启用周期性填充(单位秒)
3. 实测性能数据
百度官方测试显示,无论配置如何调整,CachedUidGenerator始终保持600万+稳定吞吐量:
多消费者场景下性能依然稳定:
🛠️ 常见问题与最佳实践
Q1:如何避免时钟回拨问题?
UidGenerator通过未来时间消费机制处理时钟回拨:当检测到时钟异常时,自动使用最后生成ID的时间戳+1秒,确保ID单调递增。
Q2:WorkerId耗尽怎么办?
默认配置支持400万+WorkerId,如果使用DisposableWorkerIdAssigner(每次重启生成新WorkerId),建议:
- 增加
workerBits(如27bit支持1.3亿WorkerId) - 减少重启频率或使用永久性WorkerId分配策略
Q3:生产环境推荐配置
// 高并发短周期场景
timeBits=28, workerBits=22, seqBits=13 → 69年使用期,400万WorkerId,8192/秒
// 长期低并发场景
timeBits=31, workerBits=21, seqBits=11 → 68年使用期,200万WorkerId,2048/秒
📝 总结
UidGenerator凭借其高性能、高可靠和灵活配置的特性,已成为分布式系统ID生成的首选方案。无论是电商订单、支付交易还是日志追踪,它都能提供稳定高效的ID服务。现在就把它集成到你的项目中,体验600万QPS的极速ID生成吧!
项目核心代码:src/main/java/com/baidu/fsg/uid/impl/
官方文档:README.md
数据库脚本:src/main/scripts/WORKER_NODE.sql
希望这篇指南能帮助你快速掌握UidGenerator的使用!如果觉得有用,别忘了给项目点个Star哦~ 🌟
【免费下载链接】uid-generator UniqueID generator 项目地址: https://gitcode.com/gh_mirrors/ui/uid-generator
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考





