# 1、需求描述
当数据量很大,并且要求 ID 唯一的时候,我们需要生成唯一 ID,我们可能会根据 ID 去不同的表中对比获取数据。所以全局唯一 ID 的两个核心需求就是:① 全局唯一性② 粗略有序性
# 2、使用数据库自增 ID 优缺点
如果使用数据库提供的自增 ID 来实现,这样的 ID 会太明显,数据量过大需要进行分表时,两个表都进行生成唯一 ID,ID 可能会冲突。mysql 自带自增生成 id,oracle 可以用序列生成 id, 但在数据库集群环境下,扩展性不好
# 3、使用 UUID 的优缺点
① 生成的 ID 太长,没有任何规律性② uuid 生成全球唯一 id, 生成方式简单粗暴,本地生成,没有网络开销,效率高;缺点长度较长,没有递增趋势性,不易维护,常用于生成 token 令牌。
# 4、雪花 ID 优缺点
基于雪花算法 snowflake 生成全局 id,本地生成,没有网络开销,效率高,但是依赖机器时钟。
# 5、Redis 生成全局唯一 ID
基于 redis 单线程的特点生成全局唯一 id,redis 性能高,支持集群分片。为了增加 ID 的安全性,我们可以不直接使用 Redis 自增的数值,而是拼接一些其它信息:
ID 的组成部分:符号位:1bit,永远为 0 时间戳:31bit,以秒为单位,可以使用 69 年序列号:32bit,秒内的计数器,支持每秒产生 2^32 个不同 ID 实现: