|
|
@@ -0,0 +1,81 @@
|
|
|
+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())
|
|
|
+}
|