掘金 后端 ( ) • 2022-08-04 12:34

Twitter 的分布式雪花算法SnowFlake , 经测试 snowflake 每秒能产出26 万个自增可排序的ID

  • twitter的SnowFlake生成ID能够按照时间有序生成
  • SnowFlake 算法生成id 的结果是一个64 bit 大小的整数,为一个Long 型(转换成字符后长度19位)
  • 分布式系统不会产生ID碰撞(由datacenter 和 workerld 区分)并且效率较高

image.png

号段解析:

1bit ,

  • 不用,因为二进制中最高位是符号位,毫秒级,生成的id一般用整数,所以最高位 0

41bit - 时间戳,用来记录时间戳,毫秒级,

  • 41位可以表示 2 ^ {41}-1个数字
  • 如果只用来表示正整数(计算机中正整数包含0)。可以表示数值范围:0 至 2^{41}-1 , 减1 是因为表示的数值是从0开始算的 ,而不是1.
  • 也就是说 41 位可以表示 2 ^ {41}-1 个毫秒的值,装换成单位年则 (2^{41}-1)/ (1000 *60 *60 *24 *365)=69年

10bit- 工作机器ID,用来记录工作机器ID

  • 可以部署在 2^{10} = 1024 个节点,包括5位 datacenterId 和 5位的 workeId
  • 5位(bit)可以表示的最大正整数是 2 ^ {5}-1 =31 , 即可以用0、1、2、3....31这32个数字,来表示不同的datacenterId 或者 workId

12 bit -序列号,序列号,用来记录同毫秒内产生的不同的id。

  • 12位可以表示的最大正整数是2^{12}-1 = 4095 即可以用0、1、2、34094 这 4095个数字来表示同一机器同一时间(毫秒)产生的4095个ID序号

源码

https://gitee.com/pingfanrenbiji/flowable-springboot-demo/commit/c9af8334cb563b5709e84aca064b245927d5b184
  • 执行SnowflakeIdWorker类的main方法
  • 启动服务 访问 http://127.0.0.1:8080/snowflake

源码分析

image.png

image.png

参考官方文档

https://github.com/cloudyan/snowflake