雪花算法
业务基因
Gene 类型定义业务数据类型,支持 64 种业务分类
业务基因
业务基因(Gene)是雪花 ID 中嵌入的 6 位业务类型标识,支持 64 种业务分类(0-63)。
Gene 类型
type Gene int64方法列表
// 返回基因名称,未定义则返回 "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("这是订单数据")
}在实体中使用
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
}type Order struct {
xModels.BaseEntity
UserID xSnowflake.SnowflakeID
OrderNo string
}
func (o *Order) GetGene() xSnowflake.Gene {
return xSnowflake.GeneOrder
}基因计算
GeneCalc 提供基于哈希的基因计算,用于分片定位:
func CalcGene() GeneCalc计算方法
// 基于单个 ID 计算基因
gene := xSnowflake.CalcGene().Hash(userID)
// 基于多个 ID 计算组合基因
gene := xSnowflake.CalcGene().HashMulti(userID, merchantID)
// 基于字符串计算基因
gene := xSnowflake.CalcGene().HashString("user_123")分片定位示例
同一用户的所有订单使用相同基因,便于数据分片:
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)