分布式主键生成方案

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 的分布式系统
相关推荐
码农学院7 分钟前
使用腾讯翻译文本
服务器·数据库·c#
@zulnger17 分钟前
正则表达式
数据库·正则表达式
源代码•宸26 分钟前
Golang基础语法(go语言error、go语言defer、go语言异常捕获、依赖管理、Go Modules命令)
开发语言·数据库·后端·算法·golang·defer·recover
optimistic_chen28 分钟前
【Redis 系列】持久化特性
linux·数据库·redis·分布式·中间件·持久化
Coder码匠29 分钟前
从项目实践中学习 Spring 事务范围优化
数据库·spring
我的golang之路果然有问题1 小时前
mysql 个人笔记导出之-数据库时间戳问题以及增删改查
数据库·笔记·学习·mysql·分享·个人笔记
张永清-老清1 小时前
每周读书与学习->JMeter性能测试脚本编写实战(三)如何利用JMeter为MySQL数据库构造测试数据
数据库·测试工具·jmeter·压力测试·性能调优·jmeter性能测试·每周读书与学习
亮子AI1 小时前
注册成功的提示信息怎么写?
数据库·python
Clang's Blog1 小时前
使用 SQL Server Management Studio 还原 .bak 备份文件的完整指南
数据库·sqlserver