分布式id生成方案原理
🔥 2025年Java面试宝典抢先领!
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
提取码: 9b3g
备战金三银四,这份资料助你横扫大厂分布式系统面试题!
为什么需要分布式id生成方案?
咱们做分布式系统,数据库都分库分表了,传统的自增ID肯定扛不住啊!比如订单表拆成8个库,每个库再拆16张表,你用MySQL自增ID试试?分分钟重复冲突!所以必须搞一套分布式id生成方案,保证全局唯一、有序、高并发。
主流分布式id生成方案盘点
📌 方案一:UUID
**原理**:
直接调用JDK的`UUID.randomUUID()`,生成128位的字符串(如`550e8400-e29b-41d4-a716-446655440000`),基于MAC地址+时间戳+随机数。
**优点**:
- 简单粗暴,本地生成无网络消耗
- 绝对唯一(理论上有重复概率,但可忽略)
**缺点**:
- 字符串太长(32字符),索引效率低
- 无序存储,导致数据库B+树频繁分裂
- 无法体现业务含义(如时间顺序)

📌 方案二:数据库自增ID(Flicker方案)
**原理**:
单独搞一张ID生成表,用`REPLACE INTO`操作+`AUTO_INCREMENT`实现:
```sql
CREATE TABLE id_generator (
id bigint(20) NOT NULL AUTO_INCREMENT,
stub char(1) NOT NULL DEFAULT '',
PRIMARY KEY (id),
UNIQUE KEY stub (stub)
) ENGINE=InnoDB;
-- 每次用这个SQL取ID
REPLACE INTO id_generator (stub) VALUES ('a');
SELECT LAST_INSERT_ID();
优点:
- ID纯数字,短小精悍
- 严格递增,适合排序场景
缺点:
- 数据库扛不住高并发(QPS上万就崩)
- 单点故障风险大
- 扩展需设置步长(如server1:1,3,5... server2:2,4,6...)

---
#### 📌 方案三:Snowflake(雪花算法)
**原理**:
Twitter开源的64位ID生成方案,结构如下:
0 | 0001100 10100010 10111110 10001001 01011100 00 | 10001 | 1 1001 | 0000 00000000 └──┴───────────────┴───────────────┴───────────────┴───────────────┴───────────────┘ 1位符号位(0) 41位时间戳(毫秒级) 10位机器ID 12位序列号
**核心逻辑**:
1. 同一毫秒内,通过序列号自增生成ID(支持4096/ms)
2. 时间戳回拨则等待或报错
3. 机器ID用ZK或配置文件分配
**优点**:
- 每秒可生成400万+ID(理论值)
- ID趋势递增,利于索引
- 本地生成无网络IO
**缺点**:
- 强依赖机器时钟(时钟回拨会重复)
- 机器ID需人工分配
---
#### 📌 方案四:Redis生成ID
```markdown
**原理**:
利用Redis的`INCR`原子性操作:
```bash
# 初始化
SET id_generator 10000
# 获取ID
INCR id_generator # 返回10001
优化点:
- 集群部署时用
INCRBY设置步长(如实例1步长1000,实例2步长1000,初始值错开) - 配合Lua脚本保证原子性
优点:
- 性能远超数据库(Redis单机10万+QPS)
- ID天然有序
缺点:
- 需维护Redis集群
- 持久化策略影响可靠性
---
### 面试场景如何回答?
面试官问:“说说分布式ID生成方案?” 建议这样答:
1. **先说痛点**:“分库分表后,自增ID会重复,所以需要分布式ID方案”
2. **对比方案**:
- 小并发用数据库自增(步长设置)
- 高并发用Snowflake(强调时间戳+机器ID+序列号)
- 超大数据量可考虑Redis集群
3. **提避坑**:
- “Snowflake要注意时钟回拨问题,我们当时用备用机器ID解决”
- “Redis方案记得配置AOF持久化防丢ID”
4. **引申优化**:
- “美团Leaf对Snowflake做了优化,用ZK管理节点”
- “百度UidGenerator支持压缩ID长度”
---
💡 **薅羊毛提示**:
如果大家需要购买**面试鸭会员**,可以通过[面试鸭返利网](https://mianshiyafanli.com)找我,**返利25元**!大厂真题+实时更新,省一杯奶茶钱不香吗?
> 返回首页:[面试鸭返利网](https://mianshiyafanli.com)


