order.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package order
  2. import (
  3. "fmt"
  4. "sync"
  5. "time"
  6. )
  7. // 更安全的版本:带毫秒时间戳
  8. type Generator struct {
  9. machineID int
  10. lastTime int64 // 上次时间(毫秒)
  11. sequence int64
  12. mu sync.Mutex
  13. }
  14. func NewOrderGenerator(machineID int) *Generator {
  15. return &Generator{
  16. machineID: machineID,
  17. lastTime: time.Now().UnixMilli(),
  18. sequence: 0,
  19. }
  20. }
  21. func (g *Generator) Generate() string {
  22. g.mu.Lock()
  23. defer g.mu.Unlock()
  24. // 获取当前毫秒时间戳
  25. currentTime := time.Now().UnixMilli()
  26. if currentTime == g.lastTime {
  27. g.sequence++
  28. } else {
  29. g.sequence = 0
  30. g.lastTime = currentTime
  31. }
  32. // 获取当前日期(年月日)
  33. dateStr := time.Now().Format("20060102")
  34. return fmt.Sprintf("%s%02d%04d", dateStr, g.machineID, g.sequence)
  35. }
  36. // 并发测试函数
  37. func TestConcurrentGeneration() {
  38. fmt.Println("=== 并发测试 ===")
  39. generator := NewOrderGenerator(1)
  40. // 使用map检查重复
  41. results := sync.Map{}
  42. var wg sync.WaitGroup
  43. start := time.Now()
  44. // 启动1000个协程同时生成订单号
  45. for i := 0; i < 1000; i++ {
  46. wg.Add(1)
  47. go func(id int) {
  48. defer wg.Done()
  49. orderNo := generator.Generate()
  50. // 检查是否重复
  51. if _, loaded := results.LoadOrStore(orderNo, true); loaded {
  52. fmt.Printf("⚠️ 发现重复订单号: %s\n", orderNo)
  53. }
  54. }(i)
  55. }
  56. wg.Wait()
  57. elapsed := time.Since(start)
  58. // 统计结果
  59. count := 0
  60. results.Range(func(key, value interface{}) bool {
  61. count++
  62. return true
  63. })
  64. fmt.Printf("生成 %d 个订单号,耗时 %v\n", count, elapsed)
  65. fmt.Printf("平均每秒生成: %.0f 个\n", float64(count)/elapsed.Seconds())
  66. }