package order import ( "fmt" "sync" "time" ) // 更安全的版本:带毫秒时间戳 type Generator struct { machineID int lastTime int64 // 上次时间(毫秒) sequence int64 mu sync.Mutex } func NewOrderGenerator(machineID int) *Generator { return &Generator{ machineID: machineID, lastTime: time.Now().UnixMilli(), sequence: 0, } } func (g *Generator) Generate() string { g.mu.Lock() defer g.mu.Unlock() // 获取当前毫秒时间戳 currentTime := time.Now().UnixMilli() if currentTime == g.lastTime { g.sequence++ } else { g.sequence = 0 g.lastTime = currentTime } // 获取当前日期(年月日) dateStr := time.Now().Format("20060102") return fmt.Sprintf("%s%02d%04d", dateStr, g.machineID, g.sequence) } // 并发测试函数 func TestConcurrentGeneration() { fmt.Println("=== 并发测试 ===") generator := NewOrderGenerator(1) // 使用map检查重复 results := sync.Map{} var wg sync.WaitGroup start := time.Now() // 启动1000个协程同时生成订单号 for i := 0; i < 1000; i++ { wg.Add(1) go func(id int) { defer wg.Done() orderNo := generator.Generate() // 检查是否重复 if _, loaded := results.LoadOrStore(orderNo, true); loaded { fmt.Printf("⚠️ 发现重复订单号: %s\n", orderNo) } }(i) } wg.Wait() elapsed := time.Since(start) // 统计结果 count := 0 results.Range(func(key, value interface{}) bool { count++ return true }) fmt.Printf("生成 %d 个订单号,耗时 %v\n", count, elapsed) fmt.Printf("平均每秒生成: %.0f 个\n", float64(count)/elapsed.Seconds()) }