| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- package server
- import (
- "fmt"
- "sync"
- "time"
- )
- type OrderSnServer struct {
- machineID int
- lastTime int64 // 上次时间(毫秒)
- sequence int64
- mu sync.Mutex
- }
- var (
- orderSnServerInstance *OrderSnServer
- orderSnServerOnce sync.Once
- )
- // GetOrderSnServerInstance 获取单例实例
- func GetOrderSnServerInstance(machineID int) *OrderSnServer {
- orderSnServerOnce.Do(func() {
- orderSnServerInstance = &OrderSnServer{
- machineID: machineID,
- lastTime: time.Now().UnixMilli(),
- sequence: 0,
- }
- })
- return orderSnServerInstance
- }
- func (g *OrderSnServer) Generate() string {
- g.mu.Lock()
- defer g.mu.Unlock()
- currentTime := time.Now().UnixMilli()
- if currentTime == g.lastTime {
- g.sequence++
- } else {
- g.sequence = 1
- g.lastTime = currentTime
- }
- // 格式化时间,包含毫秒
- t := time.UnixMilli(currentTime)
- // 格式:年月日时分秒 + 毫秒(3位) + 机器ID + 序列号
- return fmt.Sprintf("%s%03d%02d%04d",
- t.Format("20060102150405"), // 14位
- t.Nanosecond()/1e6, // 3位毫秒
- g.machineID, // 2位
- g.sequence, // 4位
- )
- }
- // GenerateString 生成字符串格式订单号
- func (g *OrderSnServer) GenerateString(prefix string) string {
- // 调用无锁Generate获取ID
- id := g.Generate()
- // 格式化为字符串
- return fmt.Sprintf("%s%s", prefix, id)
- }
|