| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- 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())
- }
|