分布式唯一 Id
Contents
[NOTE] Updated August 27, 2023. This article may have outdated content or subject matter.
UUID
universally unique identifier,统一唯一标识符,是一个128位(16字节)的数字,由算法生成,算法可以是任意的,但是算法的种类不能太多,否则就不可读。
缺点:
- ID太长,占用空间大
- 索引效率低
- 不能保证自增
snowflake
雪花算法,64位,结合时间戳和机器编号,组成唯一的ID。1bit占用位0+41bit毫秒数+10bit机器id+12bit自增序列号。
优点:
- 趋势递增,不依赖数据库等第三方系统
- 以服务方式部署,稳定性高
- 根据业务分配bit,比较灵活
缺点:
- 强依赖机器时间
- 不是严格递增,可能存在机器时间不同步
- 需要workerid唯一
受时间回拨的根本原因在于高位采用时间戳的二进制值。
redis生成id
redis的原子操作 INCR
或者 INCRBY
的自增原子命令
优点:
- 单线程,趋势递增
- 性能好
缺点:
- 迁移 redis 难度大
- 重启丢数据
美团 leaf
leaf segment
依赖分布式数据库自增 ID,一次取一批(segment)防止对数据库的频繁查询同时在ID耗尽前提前异步的取一批,提高效率。
leaf snowflake
改进了 workerid,引入 zookeeper 持久顺序节点的特性。