在go服务多节点部署的情况下,可以使用分布式锁来控制对订单编号生成,保证单号数据唯一。
例如,可以使用Redis来实现分布式锁。
package main
import (
"fmt"
"github.com/go-redis/redis/v8"
"time"
)
func main() {
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379", // Redis地址
})
// 尝试获取锁
lockKey := "order_id_lock"
lockValue := "12345" // 锁的值,可以根据实际情况设置或随机生成
ttl := 10 * time.Second // 锁的过期时间
result, err := rdb.SetNX(context.Background(), lockKey, lockValue, ttl).Result()
if err != nil {
fmt.Println("Error acquiring lock:", err)
return
}
if result {
// 获取锁成功,生成订单编号并存储订单数据等操作
orderID := generateOrderID() // 生成订单ID的函数,可以是UUID或其他方法
fmt.Println("Generated Order ID:", orderID)
// 释放锁(在实际操作中通常在defer语句中释放)
rdb.Del(context.Background(), lockKey)
} else {
fmt.Println("Failed to acquire lock, retrying...")
// 可以选择重试或等待一段时间后重试获取锁
}
}