1. 数据库自增长序列或字段
-
原理:利用数据库的自增长(Auto Increment)功能,每次插入新记录时,数据库会自动为主键字段生成一个唯一的递增值。
-
优点:
-
简单易用,无需额外逻辑。
-
生成的 ID 是连续的,适合按顺序查询的场景。
-
-
缺点:
-
不适合分布式系统,因为不同数据库实例之间可能会生成重复的 ID。
-
自增 ID 可能会暴露业务数据量(如用户数、订单数等)。
-
-
适用场景:单机数据库或主从架构的数据库。
2. UUID
-
原理:UUID(Universally Unique Identifier)是一个 128 位的全局唯一标识符,通常以 32 位十六进制字符串表示(如
550e8400-e29b-41d4-a716-446655440000
)。 -
优点:
-
全局唯一,适合分布式系统。
-
生成简单,不依赖中心化的服务。
-
-
缺点:
-
长度较长(36 个字符),占用存储空间大。
-
无序性,不适合作为数据库索引(可能导致性能问题)。
-
-
适用场景:分布式系统中需要全局唯一标识符的场景。
3. Redis 生成 ID
-
原理:利用 Redis 的原子操作(如
INCR
或INCRBY
)生成唯一的递增 ID。 -
优点:
-
高性能,Redis 是内存数据库,操作速度快。
-
可以生成全局唯一的递增 ID。
-
-
缺点:
-
依赖 Redis 的可用性,如果 Redis 宕机,可能会影响 ID 生成。
-
需要额外维护 Redis 服务。
-
-
适用场景:需要高性能、分布式唯一 ID 生成的场景。
4. Twitter 的 Snowflake 算法
-
原理:Snowflake 是 Twitter 开源的分布式 ID 生成算法,生成的 ID 是一个 64 位的整数,结构如下:
-
1 位符号位(固定为 0)。
-
41 位时间戳(毫秒级)。
-
10 位机器 ID(用于分布式部署)。
-
12 位序列号(用于同一毫秒内的并发)。
-
-
优点:
-
高性能,生成的 ID 是递增的。
-
适合分布式系统,支持高并发。
-
-
缺点:
-
依赖系统时钟,如果时钟回拨可能会导致 ID 重复。
-
需要维护机器 ID 的分配。
-
-
适用场景:高并发、分布式系统中需要生成全局唯一且有序的 ID。
5. 利用 Zookeeper 生成唯一 ID
-
原理:利用 Zookeeper 的持久顺序节点(Persistent Sequential Node)生成唯一 ID。每次创建节点时,Zookeeper 会自动在节点名称后附加一个递增的数字。
-
优点:
-
生成的 ID 是全局唯一的。
-
支持分布式系统。
-
-
缺点:
-
依赖 Zookeeper 的可用性。
-
性能较低,不适合高并发场景。
-
-
适用场景:对一致性要求较高的分布式系统。
6. MongoDB 的 ObjectId
-
原理:MongoDB 默认使用 ObjectId 作为文档的主键,它是一个 12 字节的十六进制字符串,结构如下:
-
4 字节时间戳(秒级)。
-
3 字节机器标识。
-
2 字节进程 ID。
-
3 字节随机数。
-
-
优点:
-
全局唯一,适合分布式系统。
-
生成简单,无需额外逻辑。
-
-
缺点:
-
长度较长(24 个字符),占用存储空间大。
-
无序性,不适合作为数据库索引。
-
-
适用场景:使用 MongoDB 作为数据库的分布式系统。
总结
方案 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
数据库自增长序列或字段 | 简单、连续 | 不适合分布式系统、可能暴露业务数据量 | 单机数据库或主从架构 |
UUID | 全局唯一、生成简单 | 长度长、无序性、不适合索引 | 分布式系统中需要全局唯一标识符 |
Redis 生成 ID | 高性能、全局唯一 | 依赖 Redis 可用性、需额外维护 | 高性能、分布式唯一 ID 生成 |
Twitter 的 Snowflake 算法 | 高性能、全局唯一、有序 | 依赖系统时钟、需维护机器 ID | 高并发、分布式系统中需要有序 ID |
Zookeeper 生成唯一 ID | 全局唯一、一致性高 | 性能较低、依赖 Zookeeper 可用性 | 对一致性要求较高的分布式系统 |
MongoDB 的 ObjectId | 全局唯一、生成简单 | 长度长、无序性、不适合索引 | 使用 MongoDB 的分布式系统 |