用 go 写一个分布式id生成器,要求生成的id是整型
时间: 2024-02-11 13:06:04 浏览: 58
好的,下面我为您提供一个简单的分布式 id 生成器的 Go 代码实现,该生成器可以生成整型的 id。
```go
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
// 定义一个全局的唯一 id 生成器
var generator *IDGenerator
// 定义 id 生成器结构体
type IDGenerator struct {
lastID int64 // 上一个生成的 id
machineID int64 // 机器 id
sequence int64 // 序列号
timestamp time.Time // 上一次生成 id 的时间戳
mutex sync.Mutex
}
// 生成一个新的 id
func (g *IDGenerator) NewID() int64 {
g.mutex.Lock()
defer g.mutex.Unlock()
// 获取当前时间戳
now := time.Now()
// 如果当前时间小于上一次生成 id 的时间戳,则等待时间戳更新
if now.Before(g.timestamp) {
time.Sleep(time.Millisecond)
now = time.Now()
}
// 如果当前时间等于上一次生成 id 的时间戳,则序列号加 1
if now.Equal(g.timestamp) {
g.sequence++
} else { // 否则,重置序列号为 0
g.sequence = 0
}
// 更新 id 生成时间戳
g.timestamp = now
// 生成 id
id := (now.UnixNano()/1000000)<<22 | (g.machineID << 12) | g.sequence
// 如果生成的 id 等于上一个生成的 id,则序列号加 1
if g.lastID == id {
g.sequence++
id = (now.UnixNano()/1000000)<<22 | (g.machineID << 12) | g.sequence
}
// 更新上一个生成的 id
g.lastID = id
// 返回生成的 id
return id
}
// 初始化 id 生成器
func NewIDGenerator(machineID int64) *IDGenerator {
return &IDGenerator{
lastID: 0,
machineID: machineID,
sequence: 0,
timestamp: time.Unix(0, 0),
mutex: sync.Mutex{},
}
}
func main() {
// 初始化 id 生成器
generator = NewIDGenerator(int64(rand.Intn(1024)))
// 循环生成 id
for {
id := generator.NewID()
fmt.Println(id)
time.Sleep(time.Millisecond)
}
}
```
上述代码实现了一个分布式 id 生成器,其中每个 id 由时间戳、机器 id 和序列号组成。在初始化 id 生成器时,需要指定机器 id。在生成 id 时,会根据当前时间戳、机器 id 和序列号计算出一个整型的 id,并保证生成的 id 具有唯一性。
阅读全文