orderSnServer.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package server
  2. import (
  3. "fmt"
  4. "sync"
  5. "time"
  6. )
  7. type OrderSnServer struct {
  8. machineID int
  9. lastTime int64 // 上次时间(毫秒)
  10. sequence int64
  11. mu sync.Mutex
  12. }
  13. var (
  14. orderSnServerInstance *OrderSnServer
  15. orderSnServerOnce sync.Once
  16. )
  17. // GetOrderSnServerInstance 获取单例实例
  18. func GetOrderSnServerInstance(machineID int) *OrderSnServer {
  19. orderSnServerOnce.Do(func() {
  20. orderSnServerInstance = &OrderSnServer{
  21. machineID: machineID,
  22. lastTime: time.Now().UnixMilli(),
  23. sequence: 0,
  24. }
  25. })
  26. return orderSnServerInstance
  27. }
  28. func (g *OrderSnServer) Generate() string {
  29. g.mu.Lock()
  30. defer g.mu.Unlock()
  31. currentTime := time.Now().UnixMilli()
  32. if currentTime == g.lastTime {
  33. g.sequence++
  34. } else {
  35. g.sequence = 1
  36. g.lastTime = currentTime
  37. }
  38. // 格式化时间,包含毫秒
  39. t := time.UnixMilli(currentTime)
  40. // 格式:年月日时分秒 + 毫秒(3位) + 机器ID + 序列号
  41. return fmt.Sprintf("%s%03d%02d%04d",
  42. t.Format("20060102150405"), // 14位
  43. t.Nanosecond()/1e6, // 3位毫秒
  44. g.machineID, // 2位
  45. g.sequence, // 4位
  46. )
  47. }
  48. // GenerateString 生成字符串格式订单号
  49. func (g *OrderSnServer) GenerateString(prefix string) string {
  50. // 调用无锁Generate获取ID
  51. id := g.Generate()
  52. // 格式化为字符串
  53. return fmt.Sprintf("%s%s", prefix, id)
  54. }