UUID

universally unique identifier,统一唯一标识符,是一个128位(16字节)的数字,由算法生成,算法可以是任意的,但是算法的种类不能太多,否则就不可读。

缺点:

  1. ID太长,占用空间大
  2. 索引效率低
  3. 不能保证自增

snowflake

雪花算法,64位,结合时间戳和机器编号,组成唯一的ID。1bit占用位0+41bit毫秒数+10bit机器id+12bit自增序列号。

优点:

  1. 趋势递增,不依赖数据库等第三方系统
  2. 以服务方式部署,稳定性高
  3. 根据业务分配bit,比较灵活

缺点:

  1. 强依赖机器时间
  2. 不是严格递增,可能存在机器时间不同步
  3. 需要workerid唯一

受时间回拨的根本原因在于高位采用时间戳的二进制值。

redis生成id

redis的原子操作 INCR 或者 INCRBY 的自增原子命令

优点:

  1. 单线程,趋势递增
  2. 性能好

缺点:

  1. 迁移 redis 难度大
  2. 重启丢数据

美团 leaf

leaf segment

依赖分布式数据库自增 ID,一次取一批(segment)防止对数据库的频繁查询同时在ID耗尽前提前异步的取一批,提高效率。

leaf snowflake

改进了 workerid,引入 zookeeper 持久顺序节点的特性。