【记录】Golang分布式ID生成-SonyFlake
介绍使用核心代码package id_generatorimport ("math/rand""sync""time""github.com/sony/sonyflake")var sf *sonyflake.Sonyflakevar rg = struct {sync.Mutexrand *rand.Rand}{rand: rand.New(rand.NewSource(time.Now().U
·
介绍
示例代码使用的sonyflake
go get github.com/sony/sonyflake
SonyFlake是索尼对Twitter开源的分布式ID生成算法-雪花算法(SnowFlake)改进后的算法。
示例代码中会生成17位uint64整型,单测示例代码中展示了调用示例。
核心代码
package id_generator
import (
"math/rand"
"sync"
"time"
"github.com/sony/sonyflake"
)
var sf *sonyflake.Sonyflake
var rg = struct {
sync.Mutex
rand *rand.Rand
}{
rand: rand.New(rand.NewSource(time.Now().UnixNano())),
}
func init() {
var f sonyflake.Settings
f.StartTime = time.Date(2022, 4, 1, 0, 0, 0, 0, time.UTC)
sf = sonyflake.NewSonyflake(f)
if sf == nil {
panic("id generator init error.")
}
}
func Int63nRange(min, max int64) int64 {
rg.Lock()
defer rg.Unlock()
return rg.rand.Int63n(max-min) + min
}
func GetNextId() uint64 {
ret, err := sf.NextID()
if err != nil {
ret = uint64(Int63nRange(1926425572, 1926425572223607))
}
return ret
}
单测
package id_generator
import "testing"
func TestIdGenerator(t *testing.T) {
t.Run("id_generator", func(t *testing.T) {
t.Logf("testing id:%d", int64(GetNextId()))
})
}
如果作为Mysql主键使用
id请使用 bigint 类型
更多推荐
所有评论(0)