Skip to content

一、分布式 ID 生成 6 大方案对比(面试速记表)

方案全局唯一有序性高可用典型 QPS单节点缺点/注意事项一句话口诀
① 数据库自增时间序单点1 w主库挂则断、写压力集中“小系统够用”
② 数据库号段时间序10 w号段用完需瞬时取号“批量取号,压力骤降”
③ Redis INCR时间序较高20 w宕机丢号、内存贵“内存快,持久化怕丢”
④ 雪花算法毫秒有序极高100 w+时钟回拨撞号“高性能,防回拨”
⑤ Leaf-Segment(美团)趋势增极高100 w依赖 DB 号段+内存缓存“号段+缓存双保险”
⑥ UUID/GUID完全乱序极高1000 w36 字节、索引裂“无序+大,只做日志”

生产最常用组合:Leaf-Segment(趋势递增)或 雪花增强版(毫秒内有序)+ 异常时降级 UUID。


代码示例:号段模式(Spring Boot)

java
@Service
public class SegmentService {
    @Resource private SegmentDAO dao;
    private final AtomicLong cursor = new AtomicLong();
    private volatile long max = 0;

    @PostConstruct
    public void init(){
        reload();
    }
    // 无锁取号
    public long nextId(){
        long c = cursor.getAndIncrement();
        if (c < max) return c;
        synchronized (this) {          // 号段用完重新拿
            if (cursor.get() >= max) reload();
            return cursor.getAndIncrement();
        }
    }
    private void reload(){
        Segment seg = dao.fetchNextSegment(); // DB 取新号段
        cursor.set(seg.getBegin());
        max = seg.getEnd();
    }
}

DB 表:segment(biz_tag, max_id, step, version) 用乐观锁防多节点同时取号。


“一致性哈希把 ‘全体重新映射’ 变成 ‘只动邻居’
虚拟节点把 ‘物理少导致倾斜’ 变成 ‘虚拟多而均匀’, 最终让 增删节点时数据迁移量最小、负载最平滑。”