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()