分布式 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: 各方案的优缺点?

答:

Q2: Snowflake 时钟回拨问题?

答: 记录上次时间戳,回拨时等待或使用备用 ID 序列。


⭐ 重点:分布式 ID 是分库分表的核心基础设施