分布式ID类型

UUID

算法:机器网卡、当地时间、一个随机数
优点:本地生成、生成简单、性能好
缺点:长度过长,无序且不可读,查询效率低

数据库自增ID

算法:使用数据库Id自增策略,如MySql的auto_increment。并使用两台数据库分别设置id不同的步长,生成不重复ID的策略来实现高可用。
优点:数据库生成的ID绝对有序,高可用实现方式简单
缺点:需要独立部署数据库实例,成本高,有性能瓶颈。

Redis生成ID

算法:利用Redis的自带的incr和increBy自增原子命令,保证生成的ID肯定是唯一有序的。

Twitter的snowflflake(雪花算法)

组成:0 | timestamp(41bit) | datacenterId(5bit) | machineId(5bit) | sequence(12bit)
1位(bit)符号位:由long类型在Java中带符号的,最高位位符号位,正数是,负数是1,一般系统使用的ID都是正数,所有最高位是。
41位(bit)时间戳(毫秒级):从2010-11-04开始算,2^41-1=2,199,023,255,551毫秒,换算为年= 2,199,023,255,551 ms ÷ 1000 ÷ 60 ÷ 60 ÷ 24 ÷ 365 ≈ 69.73 年
为什么是41位,因为long最大长度是64bit,64减去其他的几个组成部分只剩下41bit。
起始时间可以自定位:比如项目上线时间是2020-01-01。
5位数据中心ID:5 位二进制,最大值是 2^5 - 1 = 31,所以最多支持 32 个数据中心
5位机器ID:最多支持 32 台机器 在同一数据中心下同时生成 ID
12位序列号:同一毫秒内,每个节点可以生成的最大 ID 数量为 2¹² = 4096 个,一台机器每毫秒最多能生成 4096 个唯一 ID。如果超过,需要等待下一毫秒再生成
优点:高性能,低延迟,按时间有序,一般不会造成ID碰撞。
缺点:需要独立开发和部署,依赖机器的时钟。

UidGenerator

Leaf

posted @ 2025-07-18 08:47  Charlie-Pang  阅读(9)  评论(0)    收藏  举报