基於GO語言實現的支持高並發訂單號生成函數


 1.固定24位長度訂單號,毫秒+進程id+序號。

 2.同一毫秒內只要不超過一萬次並發,則訂單號不會重復。

github地址:https://github.com/w3liu/go-common/blob/master/number/ordernum/ordernum.go

package ordernum

import (
   "fmt"
   "github.com/w3liu/go-common/constant/timeformat"
   "os"
   "sync/atomic"
   "time"
)

var num int64

//生成24位訂單號
//前面17位代表時間精確到毫秒,中間3位代表進程id,最后4位代表序號
func Generate(t time.Time) string {
   s := t.Format(timeformat.Continuity)
   m := t.UnixNano()/1e6 - t.UnixNano()/1e9*1e3
   ms := sup(m, 3)
   p := os.Getpid() % 1000
   ps := sup(int64(p), 3)
   i := atomic.AddInt64(&num, 1)
   r := i % 10000
   rs := sup(r, 4)
   n := fmt.Sprintf("%s%s%s%s", s, ms, ps, rs)
   return n
}

//對長度不足n的數字前面補0
func sup(i int64, n int) string {
   m := fmt.Sprintf("%d", i)
   for len(m) < n {
      m = fmt.Sprintf("0%s", m)
   }
   return m
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM