在业务开发中,会存在大量的场景都需要唯一 ID 来进行标识。比如,用户需要唯一身份标识;商品需要唯一标识;消息需要唯一标识;事件需要唯一标识等等。尤其是在分布式场景下,业务会更加依赖唯一 ID。
分布式唯一 ID 的特性如下:
UUID(Universally Unique Identifier,即通用唯一标识码)算法的目的是生成某种形式的全局唯一 ID 来标识系统中的任一元素,尤其是在分布式环境下,UUID 可以不依赖中心认证即可自动生成全局唯一 ID。
UUID 的标准形式为 32 个十六进制数组成的字符串,且分割为五个部分,例如:467e8542-2275-4163-95d6-7adc205580a9。
基于使用场景的不同,会存在以下几个不同版本的 UUID 以供使用,如下所示:
UUID 的优势是性能非常高,由于是本地生成,没有网络消耗。而其也存在一些缺陷,包括不易于存储,UUID 太长,16 字节 128 位,通常以 36 长度的字符串表示;信息不安全,基于时间的 UUID 可能会造成机器的 mac 地址泄露;ID 作为 DB 主键时在特定的场景下会存在一些问题。
数据库自增 ID 是最常见的一种生成 ID 方式。利用数据库本身来进行设置,在全数据库内保持唯一。优势是使用简单,满足基本业务需求,天然有序;缺点是强依赖 DB,会由于数据库部署的一些特性而存在单点故障、数据一致性等问题。
针对上面介绍的数据库自增 ID 的缺陷,会存在以下两种优化方案:
数据库自增 ID 方案的优势是非常简单,可利用现有数据库系统的功能实现;ID 号单调自增。其缺陷包括强依赖 DB,当 DB 异常时整个系统将处于不可用的状态;ID 号的生成速率取决于所使用数据库的读写性能。
当使用数据库来生成 ID 性能不够的时候,可以尝试使用 Redis 来生成 ID。主要使用 Redis 的原子操作 INCR 和 INCRBY 来实现。优势是不依赖于数据库,使用灵活&