前言:分布式系统下生成不重复的id常见算法
1.算法
2.具体实现
1.算法
1.1 Twitter 的 Snowflake 算法规范
- 整个ID是存储在int64中的63位整数
- 41位用于存储收到请求的时间戳 - 单位毫秒
- 10位用于存储节点 - 范围从0到1023
- 12位用于存储序列号 - 范围从0到4095
+---------------------------------------------------------------------------+
| 1 Bit Unused | 41 Bit Timestamp | 10 Bit NodeId | 12 Bit Sequence ID |
+---------------------------------------------------------------------------+
收到请求的时间戳需要程序运行时定义,建议定义为相对于某一时间的毫秒偏移量。例如:定义程序起始时间为2018-01-01 00:00:00.000,则用收到请求毫秒时间戳减之即可。
节点需要在程序运行前定义。
序列号需要程序运行时定义。
同一台机器上,同一毫秒内可以产生4096个id,一秒共400w个id,理论完全够用。
2.具体实现
用go实现snowflake算法
2.1 开源库
https://github.com/bwmarrin/snowflake
2.2 示例代码
package main
import (
"github.com/bwmarrin/snowflake"
"log"
)
func main() {
node,err := snowflake.NewNode(1)
if err != nil {
log.Fatalf("newNode(1) fail, %s", err)
}
id := node.Generate()
log.Printf("id %d",id) // 1067245053014970368
}
总结
非常简单的就实现id生产,算法思路简单高可用。
如果只有一个机器是不是就可以去掉节点ID?