这是我参与「第三届青训营 -后端场」笔记创作活动的第三篇笔记
在项目开发过程中,我们小组遇到了一些比较不知道如何下手,花了比较长时间的问题,这里整理几个问题。
唯一ID生成
在抖音(极简版)项目里,在进行创建用户,发布视频,发表评论等操作的时候都需要生成一个唯一id,以便进行数据库的查找,那么唯一id生成算法就必须得用到了。
雪花算法snowflake
雪花算法算是比较经典的唯一id生成算法了,其实这个直接去掘金或者百度搜,基本上都搜得到,可以看看这篇文章:GO实现雪花算法 - 掘金 (juejin.cn)
为什么叫做雪花算法呢?因为任何一片雪花都是唯一的,顾名思义,雪花算法。
雪花算法的构成:如下图,使用一个 64 bit 的整型的数字作为全局唯一id,其中最高位是符号位,始终为0,然后41位的时间戳,精度位毫秒级,可使用69年,接下来是10位的机器码,支持1024个节点,最后是12位的计数序列号,自增。同一节点,同一毫秒最多产生4096个序号。
在第一次作业,即go语言基础的课后作业里也有用到,可以看看上面的文章来实现该算法。
idworker
idworker是go语言唯一id生成算法的一个开源库,也是基于雪花算法的,其中10位机器码分为5位的数据中心id和5位的workerid,分别用于对数据中心和工作进程进行编码,可以很方便地使用,直接在项目里引入,再运一下go mod tidy即可使用。我们项目中便是直接用idworker来生成唯一id。以下是使用方法。
首先是GitHub链接:gitstliu/go-id-worker (github.com)
引入:
import (
idworker "github.com/gitstliu/go-id-worker"
)
使用:
func makeId() int64 {
currWoker := &idworker.IdWorker{}
currWoker.InitIdWorker(1000, 1)
newID, _ := currWoker.NextId()
return newID
}
这里的1000是workerid,1是数据中心id,都可以是5位以内的整数,一般直接这样用即可,返回值即是生成的唯一id。