panghu 8 ماه پیش
والد
کامیت
9d2f10e79c
1فایلهای تغییر یافته به همراه81 افزوده شده و 0 حذف شده
  1. 81 0
      pkg/order/order.go

+ 81 - 0
pkg/order/order.go

@@ -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())
+}