首页 前端知识 分布式主键生成方案

分布式主键生成方案

2025-03-01 12:03:35 前端知识 前端哥 718 964 我要收藏

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 的分布式系统
转载请注明出处或者链接地址:https://www.qianduange.cn//article/22185.html
标签
评论
发布的文章

FastAPI 学习与使用

2025-03-01 12:03:03

(转)Java单例模式(1)

2025-03-01 12:03:58

Go语言学习笔记(五)

2025-03-01 12:03:58

微信小程序-二维码绘制

2025-03-01 12:03:57

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!