SnowFlake是twitter公司所采用的一种算法,目的是在分布式系统中生成全局唯一且趋势递增的ID
SnowFlake算法的优点:
1.生成ID时不依赖于DB,完全在内存生成,高性能高可用。
2.ID呈趋势递增,后续插入索引树的时候性能较好。
SnowFlake算法的缺点:
依赖于系统时钟的一致性。如果某台机器的系统时钟回拨,有可能造成ID冲突,或者ID乱序。
go snowFlake 库包: github.com/bwmarrin/snowflake
golang中使用snowFlake
[env] TIX_NODE_NO = 1
package util
import (
"github.com/bwmarrin/snowflake"
"os"
"fmt"
"strconv"
)
var node *snowflake.Node
// InitSnowflake initiate Snowflake node singleton.
func InitSnowflake() error {
// Get node number from env TIX_NODE_NO
key, ok := os.LookupEnv("TIX_NODE_NO")
if !ok {
return fmt.Errorf("TIX_NODE_NO is not set in system environment")
}
// Parse node number
nodeNo, err := strconv.ParseInt(key, 10, 64)
if err != nil {
return err
}
// Create snowflake node
n, err := snowflake.NewNode(nodeNo)
if err != nil {
return err
}
// Set node
node = n
return nil
}
// GenerateSnowflake generate Twitter Snowflake ID
func GenerateSnowflake() string {
return node.Generate().String()
}
使用
// Init Snowflake
err = util.InitSnowflake()
if err != nil {
log.Fatal("Unable init Snowflake node:", err.Error())
return
}
// 生成唯一id
id := util.GenerateSnowflake()