1. 首页

雪花算法生成订单号的优化,一秒钟512个ID生成

写商城的时候想用雪花算法生成订单号与用户号等信息

原来生成的订单号大概16-19位左右,有点太长,一秒几百万个ID对于普通的小商城网站也用不上这么长的

就简单的改了一下,改成一秒钟生成订单号256-512条左右就好了,节点ID也不需要255个以内,只需要一个节点ID就好了

优化完后的代码如下

package main

import (
	"fmt"
	"sync"
	"time"
)
func main() {
  id:=GetSnowflakeId1()
  fmt.Println(id)
}

func GetSnowflakeId1() (id int64) {
	worker:= NewWorker1()
	return worker.GetId()
}

// 定义一个woker工作节点所需要的基本参数
type Worker1 struct {
	mu        sync.Mutex // 添加互斥锁 确保并发安全
	timestamp int64      // 记录时间戳
	number    int64      // 当前毫秒已经生成的id序列号(从0开始累加) 1毫秒内最多生成4096个ID
}

// 实例化一个工作节点
func NewWorker1() (*Worker1) {
	return &Worker1{timestamp: 0,number:0,}
}
func (w *Worker1) GetId() int64 {
    epoch  := int64(1613811738) // 设置为去年今天的时间戳...因为位数变了后,几百年都用不完,,实际可以设置上线日期的
    idlength := uint(9)
    w.mu.Lock()
	defer w.mu.Unlock() 
	now := time.Now().Unix() // 时间戳由原来的毫秒变成了现在的秒
	if w.timestamp == now {
		w.number++
		if w.number > (-1 ^ (-1 << idlength)) {  //此处为最大节点ID,大概是2^9-1 511条, 
			for now <= w.timestamp {
				now = time.Now().Unix() 
			}
		}
	} else{ 
		w.number = 0
		w.timestamp = now // 将机器上一次生成ID的时间更新为当前时间
	} 
	ID := int64((now-epoch)<<idlength | (int64(1) << 1) | (w.number))
	return ID
}

生成后的id 8006872578 大概十位,把减去的时间戳设置为零后ID值为 834278525954 十二位数

大概就是生成的id,最大十三四位吧...也不会碰到大数转化失精问题,参考:js golang gin雪花算法生成的id返回json化精度丢失问题的解决方案-power by goblog (iq2.cn) 

当然大家也可以根据自己的实际情况做一些优化,epoch设置为上线时间戳好一些


这个是以秒为单位的获取id的,如果要改成毫秒的话自己再去改吧.一般情况下,idlength最大10,一秒钟1024个ID生成基本满足日常需求了,或者改成一毫秒2个或者4个ID生成也能满足


本文来自投稿,不代表本人立场,如若转载,请注明出处;如有问题您可以发邮件到:itlun@qq.com