四种常见的分布式ID产生方式
AI摘要: 本文介绍了四种常见的分布式ID生成方案,包括雪花算法、Redis、MySQL单机和MySQL号段模式。每种方案都详细描述了其生成逻辑、多节点唯一性保证机制以及特点。
产生原因就不多说了,单集数据库能力有限,开始数据库分库分表,那么唯一性ID就成为了需要解决的问题。
要求:
- 唯一性:任何时刻,任何节点都不允许出现重复的ID
- 高性能:高并发下也能快速生成,不能出现性能瓶颈
- 安全性:不能让用户猜测到id规律,避免安全隐患
雪花算法
+---------------------+ +---------------------+
| Node A (Worker 1) | <---> | Clock + Counter |
+---------------------+ +---------------------+
|
|--- ID1: 64-bit
| 0 00001 00000001 000000000000
| | | | |
| | | | +-- 序列号(12位): 同一毫秒内计数器
| | | +------------------ 机器ID(10位)
| | +------------------------------ 数据中心ID(5位)
| +---------------------------------------- 时间戳(41位)
v
ID: 64位整数,局部生成
生成逻辑:
- 每个节点配置唯一的机器 ID 和数据中心 ID。
- 获取当前时间戳,拼接数据中心 ID、机器 ID 和序列号。
- 同一毫秒内如果序列号溢出,则等待下一毫秒。
多节点如何唯一:靠不同的机器ID和时间戳组合保证唯一性。
特点:本地生成,无需中心节点,高性能低延迟
redis
+-----------+ +-------------+
| Node A | ----+-> | |
| | | | |
+-----------+ | | |
| | Redis主节点 |
+-----------+ | | INCR key |
| Node B | ----+-> | |
+-----------+ | |
+-------------+
|
v
ID1: 10000000001
ID2: 10000000002
生成逻辑:
- 各节点通过
INCR my_id_key
获取自增整数。 - Redis 保证原子性,每次加1,返回唯一 ID。
多节点如何唯一:所有节点访问同一个 Redis 实例,由 Redis 保证全局唯一。
特点:集中式生成,简洁可靠,但依赖 Redis 中心性能
MySQL单机
+-----------+ +-------------------+
| Node A | ----+-> | |
+-----------+ | | MySQL 单实例 |
| | INSERT 获取自增ID|
+-----------+ | | (auto_increment) |
| Node B | ----+-> | |
+-----------+ +-------------------+
|
v
ID1: 1
ID2: 2
生成逻辑:
- 所有节点向同一个 MySQL 表插入记录。
- 使用
AUTO_INCREMENT
字段自动生成 ID。 - 可配合
select last_insert_id()
获取本次插入的 ID。
多节点如何唯一:所有节点依赖同一个数据库实例,全局自增字段唯一。
特点:简单但不适合高并发,依赖数据库性能
MySQL号段模式
+----------------------+
| MySQL Segment表 |
|----------------------|
| biz_tag | max_id |
| order | 10500 |
+----------------------+
^ |
| 取出一个号段(10001 ~ 10500)
|
+-----------+-----------+
| |
+--------+ +--------+
| Node A | | Node B |
+--------+ +--------+
| |
| 本地自增: 10001++ | 本地自增: 10501++
v v
ID1: 10001 ID2: 10501
生成逻辑:
- 每个节点从 MySQL 中申请一段号段(如一次1000个)。
- MySQL表中维护每个业务的最大 ID。
- 节点拿到号段后,在本地缓存、使用。
多节点如何唯一:
- 节点之间不通信,通过数据库号段表分配不重复的区间。
特点:中心协调,节点本地生成,性能好,适合高并发