文章目录
- 1.UUID
- 2.数据库自增 ID
- 3.雪花算法
- 4.Redis 生成 ID
- 5.美团 Leaf
1.UUID
原理:UUID 是由数字和字母组成的 128 位标识符,通过特定算法随机生成,包括时间戳、计算机网卡地址等信息。常见的版本有版本 1(基于时间戳和 MAC 地址)、版本 4(纯随机数)等。
优点:
- 生成简单,本地生成,不需要依赖额外的组件或服务,能有效减少网络开销。
- 全球唯一,基本能保证在任何场景下不会重复。
缺点:
- 长度较长,通常为 36 个字符(如550e8400-e29b-41d4-a716-446655440000),占用存储空间大,在数据库存储和传输时会增加开销。
- 无序性,导致在数据库索引中效率较低,不利于排序和分页操作。
2.数据库自增 ID
原理:利用关系型数据库(如 MySQL)的自增字段特性,每插入一条数据,ID 自动递增。可以单库单表生成,也可以分库分表生成(如设置不同的初始值和步长) 。
优点:
- 简单直观,符合人们对 ID 的认知习惯,容易理解和使用。
- 有序性,方便进行排序、分页和统计等操作。
缺点:
- 性能瓶颈,在高并发场景下,数据库的写操作会成为性能瓶颈,因为自增 ID 的生成依赖数据库的锁机制。
- 扩展性差,分库分表时,ID 的生成和管理会变得复杂,需要额外的逻辑来保证唯一性。
3.雪花算法
原理:由 Twitter 开源,是一种生成 64 位整数 ID 的算法。它将 64 位划分为不同部分,包含 1 位符号位(固定为 0)、41 位时间戳(毫秒级)、10 位工作机器 ID(可支持 1024 个节点)和 12 位序列号(同一毫秒内生成不同 ID)。
优点:
- 高性能,在内存中生成,不依赖数据库等外部组件,生成速度快,能满足高并发场景。
- 有序性,根据时间戳生成,基本保证 ID 是有序的,有利于数据库索引和排序。
- 可扩展性,通过调整工作机器 ID 位数,可以适应不同规模的分布式系统。
缺点:
- 强依赖时钟,若服务器时钟回拨,可能会生成重复 ID,需要额外的处理逻辑。
- 实现相对复杂,需要对算法原理有一定了解才能正确实现和维护。
4.Redis 生成 ID
原理:利用 Redis 的INCR或INCRBY命令,以原子操作的方式递增一个键的值,以此作为 ID。也可以结合时间戳等信息生成更有意义的 ID。
优点:
- 性能高,Redis 基于内存操作,处理速度快,能应对高并发的 ID 生成需求。
- 可扩展性好,Redis 本身支持集群部署,可以方便地扩展以满足更大规模的系统需求。
缺点:
- 依赖外部组件,若 Redis 出现故障,会影响 ID 的生成。
- 没有内置的时间顺序性,如果需要有序 ID,需要额外处理。
5.美团 Leaf
原理:美团开源的分布式 ID 生成系统,支持两种模式。一是 “雪花算法” 模式,适用于强依赖 ID 有序性的场景;二是 “segment(号段)” 模式,服务端一次性分配一个号段给客户端,客户端在号段内自行生成 ID,用完后再向服务端申请新号段。
优点:
- 灵活性高,可根据不同业务场景选择不同模式,满足多样化的需求。
- 高性能,“segment” 模式下,客户端在本地生成 ID,减少了与服务端的交互,提高了性能。
缺点:
- 实现相对复杂,需要搭建和维护 Leaf 服务。
- 在 “segment” 模式下,如果号段设置不合理,可能会导致号段浪费或不足的情况。