分布式 ID 生成算法 go-snowflake

Apache
Google Go
跨平台
2020-01-14
GuaiK

【年终提升】2019尾声,来 OSC·年终盛典收割技术干货,get新技能!>>>

❄️ GO-Snowflake

Snowflake简介

在单机系统中我们会使用自增id作为数据的唯一id,自增id在数据库中有利于排序和索引,但是在分布式系统中如果还是利用数据库的自增id会引起冲突,自增id非常容易被爬虫爬取数据。在分布式系统中有使用uuid作为数据唯一id的,但是uuid是一串随机字符串,所以它无法被排序。

Twitter设计了Snowflake算法为分布式系统生成ID,Snowflake的id是int64类型,它通过datacenterId和workerId来标识分布式系统,下面看下它的组成:

1bit 41bit 5bit 5bit 12bit
符号位(保留字段) 时间戳(当前时间-纪元时间) 数据中心id 机器id 自增序列

算法简介

在使用Snowflake生成id时,首先会计算时间戳timestamp(当前时间 - 纪元时间),如果timestamp数据超过41bit则异常。同样需要判断datacenterId和workerId不能超过5bit(0-31),在处理自增序列时,如果发现自增序列超过12bit时需要等待,因为当前毫秒下12bit的自增序列被用尽,需要进入下一毫秒后自增序列继续从0开始递增。


快速开始

安装

git clone https://github.com/GUAIK-ORG/go-snowflake.git

运行

go run main.go

使用说明

创建Snowflake对象

// NewSnowflake(datacenterid, workerid int64) (*Snowflake, error)
// 参数1 (int64): 数据中心ID (可用范围:0-31)
// 参数2 (int64): 机器ID    (可用范围:0-31)
// 返回1 (*Snowflake): Snowflake对象 | nil
// 返回2 (error): 错误码
s, err := snowflake.NewSnowflake(int64(0), int64(0))
if err != nil {
    glog.Error(err)
    return
}

生成唯一ID

s, err := snowflake.NewSnowflake(int64(0), int64(0))
// ......
// (s *Snowflake) NextVal() int64
// 返回1 (int64): 唯一ID
id := s.NextVal()
// ......

通过ID获取数据中心ID与机器ID

// ......
// GetDeviceID(sid int64) (datacenterid, workerid int64)
// 参数1 (int64): 唯一ID
// 返回1 (int64): 数据中心ID
// 返回2 (int64): 机器ID
datacenterid, workerid := snowflake.GetDeviceID(id))

通过ID获取时间戳(创建ID时的时间戳 - epoch)

// ......
// GetTimestamp(sid int64) (timestamp int64)
// 参数1 (int64): 唯一ID
// 返回1 (int64): 从epoch开始计算的时间戳
t := snowflake.GetTimestamp(id)

通过ID获取生成ID时的时间戳

// ......
// GetGenTimestamp(sid int64) (timestamp int64)
// 参数1 (int64): 唯一ID
// 返回1 (int64): 唯一ID生成时的时间戳
t := snowflake.GetGenTimestamp(id)

通过ID获取生成ID时的时间(精确到:秒)

// ......
// GetGenTime(sid int64)
// 参数1 (int64): 唯一ID
// 返回1 (string): 唯一ID生成时的时间
tStr := snowflake.GetGenTime(id)

查看时间戳字段使用占比(41bit能存储的范围:从epoch开始往后69年)

// ......
// GetTimestampStatus() (state float64)
// 返回1 (float64): 时间戳字段使用占比(范围 0.0 - 1.0)
status := snowflake.GetTimestampStatus()
的码云指数为
超过 的项目
加载中

评论(2)

GuaiK
GuaiK 软件作者
这个也是1-41-10-12的bit分配呀

暂无资讯

暂无问答

雪花算法Snowflake

package com.freshconnect.scmall.front.web.supply.services; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.atomic.AtomicLong; /** * java ed...

2019/04/11 13:42
11
0
分布式系统中 Unique ID 的生成方法

本文主要介绍在一个分布式系统中, 怎么样生成全局唯一的 ID 一, 问题描述 在分布式系统存在多个 Shard 的场景中, 同时在各个 Shard 插入数据时, 怎么给这些数据生成全局的 unique ID? 在单机...

2016/01/14 21:27
37
1
分布式 ID 生成算法 -- Snowflake

分布式 ID 生成算法 -- Snowflake Snowflake 是 Twitter 采用的一种分布式 ID 生成算法。 核心 Snowflake 算法生成的 ID 包含四个部分: 最高一位 占用 1 bit,值始终是 0,没有实际作用 时间...

2018/09/25 14:22
5
0
分布式系统中, 怎么样生成全局唯一的 ID

分布式系统中, 怎么样生成全局唯一的 ID

2016/03/26 15:46
20
1
一个实现 Twitter SnowFlake 算法 的 Go 分布式 UID 生成器

goSnowFlake According to the Twitter SnowFlake Theory, A ThreadSafe Unique ID Generator written by Golang 根据 Twitter SnowFlake 算法, 实现的分布式线程安全 UID 生成器 Feature 线...

2016/04/07 15:39
184
1
分布式唯一ID服务架构

一、背景介绍 在大型互联网应用中,随着用户数的增加;为了提高应用的性能,我们经常需要对数据库进行分库分表操作。在单表时代我们可以完全依赖于数据库的自增ID来唯一标识一个条数据。但是...

2019/01/05 10:23
55
0
分布式自增ID算法

Twitter的Snowflake https://www.oschina.net/p/twitter-snowflake

2018/09/25 14:23
25
0
分布式全局序列号生产,Twitter Snowflake算法,雪花算法

snowflake的结构如下(每部分用-分开): 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 第一位为未使用,接下来的41位为毫秒级时间(41位的长度可以使用6...

2018/09/13 15:18
258
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部