分布式主键生成方案

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 的分布式系统
相关推荐
Coder_Boy_13 分钟前
基于SpringAI的在线考试系统-整体架构优化设计方案
java·数据库·人工智能·spring boot·架构·ddd
fen_fen9 小时前
Oracle建表语句示例
数据库·oracle
砚边数影10 小时前
数据可视化入门:Matplotlib 基础语法与折线图绘制
数据库·信息可视化·matplotlib·数据可视化·kingbase·数据库平替用金仓·金仓数据库
orange_tt10 小时前
Djiango配置Celery
数据库·sqlite
云小逸11 小时前
【nmap源码学习】 Nmap网络扫描工具深度解析:从基础参数到核心扫描逻辑
网络·数据库·学习
肉包_51111 小时前
两个数据库互锁,用全局变量互锁会偶发软件卡死
开发语言·数据库·c++
霖霖总总12 小时前
[小技巧64]深入解析 MySQL InnoDB 的 Checkpoint 机制:原理、类型与调优
数据库·mysql
此刻你13 小时前
常用的 SQL 语句
数据库·sql·oracle
それども13 小时前
分库分表的事务问题 - 怎么实现事务
java·数据库·mysql
·云扬·13 小时前
MySQL Binlog 配置指南与核心作用解析
数据库·mysql·adb