首页 > 编程语言 >分布式ID:SnowFlake 雪花算法 Go实现

分布式ID:SnowFlake 雪花算法 Go实现

时间:2024-06-10 16:58:47浏览次数:27  
标签:SnowFlake sequence id gen ID currentTimestamp Go 节点

分布式ID特性:

  • 趋势有序性(作为数据库主键时,顺序IO相较随机IO更友好)
  • 较UUID更短(占用更小的存储,只占64bit)
  • 其它(略)

64bit构成:

时间偏移(42bit) | 数据中心ID(5bit) | 节点ID(5bit) | 序号(12bit)

可按需自定义调整某部分的bit长度,比如把节点ID改为 3 bit 

  1. 时间偏移:当前时间 - 初始时间
  2. 数据中心:用于多中心场景
  3. 节点ID:用于分布式场景,如准备3个节点构成集群来生成分布式ID, 那么这三个节点的配置文件中,节点ID一定不要重复,如分别为1、2、3
  4. 序号:用于毫秒级并发时,自增序号

源码

https://github.com/xuezhongde/id-generator


func (gen *Generator) NextId() (int64, error) {
	currentTimestamp := currentTimeMillis()
	if currentTimestamp < gen.lastTimestamp {
		return -1, errors.New("Clock moved backwards.  Refusing to generate id")
	}

	gen.lck.Lock()
	if currentTimestamp == gen.lastTimestamp {
		gen.sequence = (gen.sequence + 1) & gen.maxSequence
		//同一毫秒的序列数已经达到最大
		if gen.sequence == 0 {
			currentTimestamp = gen.getNextTimestamp()
		}
	} else {
		gen.sequence = 0
	}

	gen.lastTimestamp = currentTimestamp
	gen.lck.Unlock()

	return (currentTimestamp-gen.StartTimestamp)<<gen.timestampShift | gen.DataCenterId<<gen.dataCenterShift | gen.WorkerId<<gen.workerShift | gen.sequence, nil
}

测试

git clone 下源码后,启动服务,访问地址:http://localhost:8080/id/next

配置文件

参见源码中的 /etc/id.toml

注意事项

服务器网络时间同步一致,注意时间回拨问题

标签:SnowFlake,sequence,id,gen,ID,currentTimestamp,Go,节点
From: https://blog.csdn.net/qq_43083126/article/details/139578323

相关文章

  • 【四种语言一网打尽(C\C++\Python\Golang)】L1-006 连续因子
    L1-006连续因子一个正整数N的因子中可能存在若干连续的数字。例如630可以分解为3×5×6×7,其中5、6、7就是3个连续的数字。给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。输入格式:输入在一行中给出一个正整数N(1<N<2^31)。输......
  • Zgo - custom_log.go
     packagemainimport("fmt""io""log""os""path")funcmain(){flag:=os.O_APPEND|os.O_CREATE|os.O_WRONLYlogFile:=path.Join(os.TempDir(),"mGo.log")......
  • Zgo - stats.go
     packagemainimport("fmt""math""os""slices""strconv")funcmain(){args:=os.Argsiflen(args)==1{fmt.Println("Needoneormorearguments!")......
  • Zgo - which.go
     packagemainimport("fmt""os""path/filepath")funcmain(){args:=os.Argsiflen(args)==1{fmt.Println("Pleaseprovideanargument!")return}file:=args......
  • idea Webstorm Pycharm2024最新版 永久使用教程 附激活码亲测可用2099年
    IDEA2024的激活与安装(全网最靠谱,最快捷的方式)大家都在为使用IDEA需要收费而烦恼。IDEA,即IntelliJIDEA,是一款强大的集成开发环境,广泛应用于Java开发。但是IDEA是付费的,免费版功能有太少,怎么才能既免费,又能使用上正式版呢!当然还是激活啦(不是正版用不起,而是‘激活’更有性价比)......
  • 运维系列:nginx 重启报nginx: [error] invalid PID number ““ in “/run/nginx.pid“
    这nginx重启报nginx:[error]invalidPIDnumber““in“/run/nginx.pid“nginx重启报nginx:[error]invalidPIDnumber““in“/run/nginx.pid“为何出现这种原因?解决方式:nginx重启报nginx:[error]invalidPIDnumber““in“/run/nginx.pid“......
  • 在Linux中,RAID 是什么?
    在Linux中,RAID(RedundantArraysofIndependentDisks,独立磁盘冗余阵列)是一种磁盘存储技术,它通过组合多个独立磁盘(物理磁盘)来提供更高的数据可靠性、性能和数据冗余。RAID技术最初是由加州大学伯克利分校在1987年提出的,目的是通过组合小的廉价磁盘来代替大的昂贵磁盘,同时提供数据......
  • 互联网专线、IDC等客户筑起一道坚不可摧的安全防
    在互联网的浩瀚海洋中,分布式拒绝服务(DDoS)攻击如同潜伏的暗流,随时可能对企业网络造成致命冲击。作为通信行业的领军者,中国联通深知此威胁之重,特推出Anti-DDoS云盾服务,旨在为互联网专线、IDC等客户筑起一道坚不可摧的安全防线,让每一次连接都安心可靠。产品优势**1.攻击检测:全景洞......
  • nuxt框架中路由动态传参及结构分析之文章跳转详情页面传递文章id
    在nuxt里面我们会经常使用到路由传递参数,列如,登录,文章跳转详情页面等,下面我就以文章列表跳转文章详情页面记录一下。1、首先这个是我的目录结构:在文章列表页面:list.vue(layout目录下的这里其实是一个组件)里面我写了这样一段实现跳转传递,这里我使用到了<nuxt-link>(当然你有其他......
  • CF1970F1 Playing Quidditch (Easy) 题解
    一道大模拟题。这道题可以用一个 map 记录球员及鬼飞球当时的坐标,用一个数组 a 记录是否有人进球,用另一个数组 b 记录每位球员是否有鬼飞球。当球员抓住鬼飞球后,鬼飞球跟着这个球员移动,直到这个球员投球。话不多说,直接上代码。MyCode:#include<bits/stdc++.h>#de......