mirror of
https://gitee.com/hyperf/hyperf.git
synced 2024-11-30 10:47:44 +08:00
Update snowflake doc
This commit is contained in:
parent
82cee05c03
commit
d581e6d9c9
BIN
doc/zh/imgs/snowflake.jpeg
Normal file
BIN
doc/zh/imgs/snowflake.jpeg
Normal file
Binary file not shown.
After Width: | Height: | Size: 30 KiB |
Binary file not shown.
Before Width: | Height: | Size: 27 KiB |
@ -1,8 +1,28 @@
|
||||
# Snowflake
|
||||
|
||||
> `snowflake` 是 `Twitter` 开源的分布式 `ID生成算法`,结果是一个 `long` 型的 `ID`。其核心思想是:使用 `41bit` 作为毫秒数,`10bit` 作为机器的 `ID`(5 个 `bit` 是数据中心,5 个 `bit` 的机器 `ID`),`12bit` 作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 `4096` 个 `ID`),最后还有一个符号位,永远是 `0`。
|
||||
## 算法介绍
|
||||
|
||||
![snowflake](./imgs/snowflake.jpg)
|
||||
`Snowflake` 算法生成 `ID` 的结果是一个 `64bit` 大小的长整,它的结构如下图:
|
||||
|
||||
![snowflake](./imgs/snowflake.jpeg)
|
||||
|
||||
- `1位`,不用。
|
||||
- 二进制中最高位为符号位,我们生成的 `ID` 一般都是正整数,所以这个最高位固定是 0。
|
||||
|
||||
- `41位`,用来记录时间戳(毫秒)。
|
||||
- 41位可以表示 `2^41 - 1` 个数字。
|
||||
- 也就是说41位可以表示 `2^41 - 1` 个毫秒的值,转化成单位年则是 `(2^41 - 1) / (1000 * 60 * 60 * 24 * 365)` 约为 `69` 年。
|
||||
|
||||
- `10位`,用来记录工作机器 `ID`。
|
||||
- 可以部署在 `2^10` 共 `1024` 个节点,包括 `5` 位 `DatacenterId` 和 `5` 位 `WorkerId`。
|
||||
|
||||
- `12位`,序列号,用来记录同毫秒内产生的不同 `id`。
|
||||
- 12位(bit)可以表示的最大正整数是 `2^12 - 1` 共 `4095` 个数字,来表示同一机器同一时间截(毫秒)内产生的 `4095` 个 `ID` 序号。
|
||||
|
||||
`Snowflake` 可以保证:
|
||||
|
||||
- 所有生成的 `ID` 按时间趋势递增。
|
||||
- 整个分布式系统内不会产生重复 `ID`(因为有 `DatacenterId` 和 `WorkerId` 来做区分)。
|
||||
|
||||
## 安装
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user