竹简文档
雪花算法

概述

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 类型

snowflake.go
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 保证并发安全
  • 序列号用尽时自旋等待下一毫秒
  • 支持高并发场景

下一步

On this page