乐趣区

关于java:雪花算法详解原理优缺点及代码实现

目录

  • 雪花算法简介
  • 雪花算法的优缺点
  • 雪花算法原理
  • 雪花算法代码实现

雪花算法简介

雪花算法,英文名为 snowflake,翻译过去就是是雪花,所以叫雪花算法。

在大自然雪花造成过程中,会造成不同的构造分支,所以说不存在两片齐全一样的雪花,示意生成的 id 如雪花般举世无双。

雪花算法,它最早是 twitter 外部应用的分布式环境下的惟一分布式 ID 生成算法。

雪花算法的优缺点

雪花算法,它至多有如下 4 个长处:

1. 零碎环境 ID 不反复

能满足高并发分布式系统环境 ID 不反复,比方大家熟知的分布式场景下的数据库表的 ID 生成。

2. 生成效率极高

在高并发,以及分布式环境下,除了生成不反复 id,每秒可生成百万个不反复 id,生成效率极高。

3. 保障根本有序递增

基于工夫戳,能够保障根本有序递增,很多业务场景都有这个需要。

4. 不依赖第三方库

不依赖第三方的库,或者中间件,算法简略,在内存中进行。

雪花算法,有一个比拟大的毛病:

依赖服务器工夫,服务器时钟回拨时可能会生成反复 id。

雪花算法原理

具体的雪花算法结构如下图所示:

雪花算法的原理:就是生成一个的 64 位的 long 类型的惟一 id,次要分为如下 4 个局部组成:

1)1 位保留 (根本不必)

1 位标识:因为 long 根本类型在 Java 中是带符号的,最高位是符号位,负数是 0,正数是 1,所以 id 个别是负数,最高位是 0,所以这第一位都是 0。

2)41 位工夫戳

接下来 41 位存储毫秒级工夫戳,41 位能够示意 2^41- 1 个毫秒的值,转化成单位年则是:(2^41−1)/(1000∗60∗60∗24∗365)=69 年。

41 位工夫戳:也就是说这个工夫戳能够应用 69 年不反复,大略能够应用 69 年。

留神:41 位工夫截不是存储以后工夫的工夫截,而是存储工夫截的差值“以后工夫截 – 开始工夫截”失去的值。

这里的的开始工夫截,个别是咱们的 id 生成器开始应用的工夫,由咱们程序来指定的,个别设置好后就不要去扭转了,切记!!!

因为,雪花算法有如下毛病:依赖服务器工夫,服务器时钟回拨时可能会生成反复 id

3)10 位机器

10 位的数据机器位,能够部署在 1024 个节点,包含 5 位 datacenterId 和 5 位 workerId,最多能够部署 2^10=1024 台机器。

这里的 5 位能够示意的最大正整数是 2^5−1=31,即能够用 0、1、2、3、….31 这 32 个数字,来示意不同的 datecenterId,或 workerId。

4)12bit 序列号

用来记录同毫秒内产生的不同 id,12 位的计数顺序号反对每个节点每毫秒 (同一机器,同一时间截) 产生 4096 个 ID 序号。

实践上雪花算法计划的 QPS 约为 409.6w/s,这种调配形式能够保障在任何一个 IDC 的任何一台机器在任意毫秒内生成的 ID 都是不同的。

作者简介

陈睿 |mikechen,10 年 + 大厂架构教训,《mikechen 的互联网架构》系列文章作者,专一于互联网架构技术。

浏览 mikechen 的互联网架构更多技术文章合集

Java 并发 |JVM|MySQL|Spring|Redis| 分布式 | 高并发

关注「mikechen 的互联网架构」公众号,回复 【架构】 支付《mikechen 的互联网架构●原创技术合集》

退出移动版