分布式主键生成方案

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 的分布式系统
相关推荐
nongcunqq1 天前
abap 操作 excel
java·数据库·excel
rain bye bye1 天前
calibre LVS 跑不起来 就将setup 的LVS Option connect下的 connect all nets by name 打开。
服务器·数据库·lvs
阿里云大数据AI技术1 天前
云栖实录|MaxCompute全新升级:AI时代的原生数据仓库
大数据·数据库·云原生
不剪发的Tony老师1 天前
Valentina Studio:一款跨平台的数据库管理工具
数据库·sql
weixin_307779131 天前
在 Microsoft Azure 上部署 ClickHouse 数据仓库:托管服务与自行部署的全面指南
开发语言·数据库·数据仓库·云计算·azure
六元七角八分1 天前
pom.xml
xml·数据库
虚行1 天前
Mysql 数据同步中间件 对比
数据库·mysql·中间件
奥尔特星云大使1 天前
mysql读写分离中间件Atlas安装部署及使用
数据库·mysql·中间件·读写分离·atlas
牛马baby1 天前
【mysql】in 用到索引了吗?
数据库·mysql·in
杀气丶1 天前
L2JBR - 修复数据库编码为UTF8
数据库·sql·oracle