雪花算法是Twitter开源的分布式ID生成算法。
雪花算法使用一个64bit的long型的数字作为全局唯一ID。在分布式系统中的应用十分广泛,且ID引入了时间戳,基本上保持自增的。
64bit的long型数字组成如下:
- 第一部分:1bit,0,无意义的数字
因为二进制里第一个bit如果为1,那么都是负数,但是我们生成的ID都是正数,所以第一个bit统一都是0
- 第二部分:41bit,表示的是时间戳
毫秒的时间戳,41bit可以表示的数字多达2^41-1个毫秒值,换成年就是表示69年的时间
- 第三部分:5bit,表示机房ID,10001
代表最多可以配置2^25个机房(32个机房)
- 第四部分:5bit,表示机器ID,11001
代表每个机房可以配置2^25个机器,根据实际情况配置
- 第五部分:12bit,表示的序号,就是莫个机房某机器上这一毫秒内同事生成的ID的序号, 0000 00000000
12 bit 可以代表的最大正整数是 2 ^ 12 - 1 = 4096,也就是说可以用这个 12 bit 代表的数字来区分同一个毫秒内的 4096 个不同的 ID。
这个算法可以保证,一个机房的一台机器上,在同一毫秒内生成了一个唯一的 ID。可能一个毫秒内会生成多个 ID,但是有最后 12 个 bit 的序号来区分开来,
记录这台机房的这台机器上这一毫秒内,这是第几个请求,给这次生成 ID 的请求累加一个序号,作为最后的 12 个 bit。
生产的64bit数字类似于:0 | 0000100 10100010 10100010 10100010 00 | 10001 | 1 1001 | 0000 00000001
雪花算法的优点:
- 高性能高可用:生产时不依赖数据库,在内存中生存。
- 容量大:每秒钟能生成数百万的自增ID。
- ID顺序增长:存入数据库中,索引效率高。
雪花算法的缺点:
- 依赖于系统时间的一致性:如果系统时间被回调或改变,可能造成ID冲突或者重复。
- 机房和机器ID需要配置:如果机房和机器ID在多个都节点中都采用一样的值,会加大冲突的概率。