赞
踩
雪花算法,是Twitter开源的由64位整数组成分布式ID,性能较高,并且在单机上递增
1.第一位 占用1bit,其值始终是0,没有实际作用。
2.时间戳 占用41bit,单位为毫秒,总共可以容纳约69年的时间。当然,我们的时间毫秒计数不会真的从1970年开始记,所以这里的时间戳只是相对于某个时间的增量。
3.工作机器id 占用10bit,其中高位5bit是数据中心ID,低位5bit是工作节点ID,最多可以容纳1024个节点。
4.序列号 占用12bit,用来记录同毫秒内产生的不同id。每个节点每毫秒0开始不断累加,最多可以累加到4095,同一毫秒一共可以产生4096个ID
同一毫秒的ID数量 = 1024 * 4096 = 4194304
package main import ( "fmt" "github.com/bwmarrin/snowflake" "time" ) var node *snowflake.Node func Init(startTime string, machineID int64) (err error) { var st time.Time st, err = time.Parse("2006-01-02", startTime) if err != nil { return } snowflake.Epoch = st.UnixNano() / 1000000 node, err = snowflake.NewNode(machineID) return } func GenID() int64 { return node.Generate().Int64() } func main() { if err := Init("2020-07-01", 1); err != nil { fmt.Printf("init failed, err:%v\n", err) return } id := GenID() fmt.Println(id) }
不仅仅是用于用户ID,实际上互联网中有很多场景需要能够生成类似MySQL自增ID这样不断增大,同时又不会重复的id,以支持业务中的高并发场景,例如在消息队列系统中,为每一个消息生成全局的唯一ID等。
比较典型的场景有:电商促销时短时间内会有大量的订单涌入到系统,微博出现爆炸性新闻时会产生大量的相关微博转发和评论消息。
js支持最大的整型范围为53位,超过这个范围就会丢失精度,53之内可以直接由js读取,超过53位就需要转换成字符串才能保证js处理正确。53位存储的话,32位存储秒级时间戳,5位存储机器码,16位存储序列化,这样每台机器每秒可以生产65536个不重复的id。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。