雪花算法
概述
xSnowflake 包提供带业务基因的分布式唯一 ID 生成器
雪花算法
xSnowflake 包实现了带业务基因的雪花算法(Gene Snowflake ID),在标准雪花算法基础上嵌入 6 位业务基因,便于从 ID 直接识别数据类型。
import xSnowflake "github.com/bamboo-services/bamboo-base-go/common/snowflake"ID 结构
64 位 ID 的位分配:
┌─────────┬──────────────────────────────────────────┬────────┬────────────┬────────┬────────────┐
│ 符号位 │ 时间戳 │ 基因 │ 数据中心ID │ 节点ID │ 序列号 │
│ 1 bit │ 41 bits │ 6 bits │ 3 bits │ 3 bits │ 10 bits │
│ (不用) │ (毫秒级,约69年) │ (0-63) │ (0-7) │ (0-7) │ (0-1023) │
└─────────┴──────────────────────────────────────────┴────────┴────────────┴────────┴────────────┘
63 62 22 21-16 15-13 12-10 9-0字段
类型
快速使用
生成 ID
// 使用默认节点生成普通 ID
id := xSnowflake.GenerateID()
// 生成带业务基因的 ID
userID := xSnowflake.GenerateID(xSnowflake.GeneUser)
orderID := xSnowflake.GenerateID(xSnowflake.GeneOrder)解析 ID
id := xSnowflake.GenerateID(xSnowflake.GeneUser)
fmt.Println("时间:", id.Timestamp()) // 2024-01-15 10:30:00
fmt.Println("基因:", id.Gene()) // User
fmt.Println("数据中心:", id.DatacenterID()) // 1
fmt.Println("节点:", id.NodeID()) // 2
fmt.Println("序列号:", id.Sequence()) // 0字符串转换
// ID 转字符串
str := id.String() // "1234567890123456789"
// 字符串转 ID
id, err := xSnowflake.ParseSnowflakeID("1234567890123456789")SnowflakeID 类型
type SnowflakeID int64方法列表
字段
类型
序列化支持
SnowflakeID 实现了多种序列化接口:
// JSON 序列化为字符串(避免 JavaScript 精度丢失)
json.Marshal(id) // "1234567890123456789"
// GORM 数据库读写
type User struct {
ID xSnowflake.SnowflakeID `gorm:"type:bigint;primaryKey"`
}
// Redis 二进制存储
rdb.Set(ctx, "key", id, 0)性能与容量
| 指标 | 数值 |
|---|---|
| 每毫秒每节点 | 1,024 个 ID |
| 每秒每节点 | 1,024,000 个 ID |
| 集群节点数 | 8 × 8 = 64 个 |
| 集群每秒总量 | 65,536,000 个 ID |
| 时间有效期 | 约 69 年(至 2092 年) |
线程安全
- 使用
sync.Mutex保证并发安全 - 序列号用尽时自旋等待下一毫秒
- 支持高并发场景