【记录】Golang分布式ID生成-SonyFlake

介绍

示例代码使用的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 类型 

你可能感兴趣的:(记录,go,后端)