分布式主键生成方案

1. 数据库自增长序列或字段

  • 原理:利用数据库的自增长(Auto Increment)功能,每次插入新记录时,数据库会自动为主键字段生成一个唯一的递增值。

  • 优点

    • 简单易用,无需额外逻辑。

    • 生成的 ID 是连续的,适合按顺序查询的场景。

  • 缺点

    • 不适合分布式系统,因为不同数据库实例之间可能会生成重复的 ID。

    • 自增 ID 可能会暴露业务数据量(如用户数、订单数等)。

  • 适用场景:单机数据库或主从架构的数据库。


2. UUID

  • 原理 :UUID(Universally Unique Identifier)是一个 128 位的全局唯一标识符,通常以 32 位十六进制字符串表示(如 550e8400-e29b-41d4-a716-446655440000)。

  • 优点

    • 全局唯一,适合分布式系统。

    • 生成简单,不依赖中心化的服务。

  • 缺点

    • 长度较长(36 个字符),占用存储空间大。

    • 无序性,不适合作为数据库索引(可能导致性能问题)。

  • 适用场景:分布式系统中需要全局唯一标识符的场景。


3. Redis 生成 ID

  • 原理 :利用 Redis 的原子操作(如 INCRINCRBY)生成唯一的递增 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 的分布式系统
相关推荐
数据智能老司机5 小时前
CockroachDB权威指南——CockroachDB SQL
数据库·分布式·架构
数据智能老司机6 小时前
CockroachDB权威指南——开始使用
数据库·分布式·架构
松果猿6 小时前
空间数据库学习(二)—— PostgreSQL数据库的备份转储和导入恢复
数据库
无名之逆6 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
s9123601016 小时前
rust 同时处理多个异步任务
java·数据库·rust
数据智能老司机6 小时前
CockroachDB权威指南——CockroachDB 架构
数据库·分布式·架构
hzulwy7 小时前
Redis常用的数据结构及其使用场景
数据库·redis
程序猿熊跃晖7 小时前
解决 MyBatis-Plus 中 `update.setProcInsId(null)` 不生效的问题
数据库·tomcat·mybatis
Three~stone8 小时前
MySQL学习集--DDL
数据库·sql·学习
Qi妙代码8 小时前
MYSQL基础
数据库·mysql·oracle