分布式 ID
分库分表后的唯一 ID 生成策略
🎯 面试重点
- 分布式 ID 的要求
- 各方案的优缺点
- 选型建议
📖 要求和方案
要求
/**
* 分布式 ID 要求
*/
public class IDRequirements {
// 1. 全局唯一
// 2. 趋势递增(利于索引)
// 3. 高性能
// 4. 高可用
// 5. 接入简单
}
方案对比
/**
* 分布式 ID 方案
*/
public class IDSolutions {
// 1. UUID
/*
* 优点:本地生成,无网络开销
* 缺点:无序、占用空间大(36字节)
* 适用:不适合数据库主键
*/
// 2. 数据库自增
/*
* 优点:简单、有序
* 缺点:单点、瓶颈
* 适用:单库单表
*/
// 3. 号段模式
/*
* 优点:性能好、趋势递增
* 缺点:依赖数据库
* 适用:一般业务
*/
// 4. Snowflake
/*
* 优点:高性能、有序、不依赖第三方
* 缺点:依赖时钟
* 适用:大部分场景
*/
// 5. Leaf(美团)
/*
* 基于 Snowflake + 号段
* 解决时钟回拨问题
*/
// 6. 百度UidGenerator
/*
* 基于 Snowflake 优化
* 支持分段获取
*/
}
📖 Snowflake 原理
/**
* Snowflake 算法
*
* 64 位结构:
* 1 位:符号位(0)
* 41 位:时间戳(支持 69 年)
* 10 位:机器 ID(1024)
* 12 位:序列号(每毫秒 4096)
*/
public class Snowflake {
// 示例代码
/*
* long id = (timestamp - epoch) << 22
* | (machineId << 12)
* | sequence;
*/
}
📖 面试真题
Q1: 各方案的优缺点?
答:
- UUID:简单但无序、占用大
- 数据库自增:有序但单点
- Snowflake:高性能、有序但依赖时钟
Q2: Snowflake 时钟回拨问题?
答: 记录上次时间戳,回拨时等待或使用备用 ID 序列。
⭐ 重点:分布式 ID 是分库分表的核心基础设施