竹简文档
雪花算法

业务基因

Gene 类型定义业务数据类型,支持 64 种业务分类

业务基因

业务基因(Gene)是雪花 ID 中嵌入的 6 位业务类型标识,支持 64 种业务分类(0-63)。

Gene 类型

gene.go
type Gene int64

方法列表

gene.go
// 返回基因名称,未定义则返回 "Custom(n)"
func (g Gene) String() string

// 判断是否为系统级别 (0-15)
func (g Gene) IsSystem() bool

// 判断是否为业务级别 (16-63)
func (g Gene) IsBusiness() bool

// 判断是否在有效范围 (0-63)
func (g Gene) IsValid() bool

// 返回 int64 值
func (g Gene) Int64() int64

预定义基因

系统级别 (0-15)

用于框架和系统内部数据:

字段

类型

业务级别 (16-63)

用于业务数据:

字段

类型

使用示例

生成带基因的 ID

// 生成用户 ID
userID := xSnowflake.GenerateID(xSnowflake.GeneUser)

// 生成订单 ID
orderID := xSnowflake.GenerateID(xSnowflake.GeneOrder)

// 生成支付 ID
paymentID := xSnowflake.GenerateID(xSnowflake.GenePayment)

从 ID 提取基因

id := xSnowflake.GenerateID(xSnowflake.GeneOrder)

gene := id.Gene()
fmt.Println(gene.String()) // "Order"

// 判断基因类型
if gene.IsBusiness() {
    fmt.Println("这是业务数据")
}

if gene == xSnowflake.GeneOrder {
    fmt.Println("这是订单数据")
}

在实体中使用

entity/user.go
package entity

import (
    xModels "github.com/bamboo-services/bamboo-base-go/major/models"
    xSnowflake "github.com/bamboo-services/bamboo-base-go/common/snowflake"
)

type User struct {
    xModels.BaseEntity
    Username string `gorm:"type:varchar(64)"`
}

// 实现 GeneProvider 接口
func (u *User) GetGene() xSnowflake.Gene {
    return xSnowflake.GeneUser
}
entity/order.go
type Order struct {
    xModels.BaseEntity
    UserID  xSnowflake.SnowflakeID
    OrderNo string
}

func (o *Order) GetGene() xSnowflake.Gene {
    return xSnowflake.GeneOrder
}

基因计算

GeneCalc 提供基于哈希的基因计算,用于分片定位:

gene_calc.go
func CalcGene() GeneCalc

计算方法

// 基于单个 ID 计算基因
gene := xSnowflake.CalcGene().Hash(userID)

// 基于多个 ID 计算组合基因
gene := xSnowflake.CalcGene().HashMulti(userID, merchantID)

// 基于字符串计算基因
gene := xSnowflake.CalcGene().HashString("user_123")

分片定位示例

同一用户的所有订单使用相同基因,便于数据分片:

entity/order.go
type Order struct {
    xModels.BaseEntity
    UserID  xSnowflake.SnowflakeID
    OrderNo string
}

// 基于用户 ID 计算基因,实现同用户数据分片
func (o *Order) GetGene() xSnowflake.Gene {
    return xSnowflake.CalcGene().Hash(o.UserID)
}

效果:

  • 同一用户的所有订单具有相同的基因值
  • 便于按用户维度进行数据分片
  • 查询同一用户的订单时可以定位到同一分片

自定义基因

可以使用 32-63 范围内未定义的值作为自定义基因:

const (
    // 自定义业务基因
    GeneMyBusiness xSnowflake.Gene = 32
    GeneMyData     xSnowflake.Gene = 33
)

// 使用自定义基因
id := xSnowflake.GenerateID(GeneMyBusiness)

下一步

On this page