uniqueid

package module
v0.0.0-...-a9e3092 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 2, 2019 License: Apache-2.0 Imports: 5 Imported by: 0

README

uniqueid

分布式唯一id生成器,参考雪花算法Twitter's Snowflake

生成的为63位无符号整数(sqlite3只支持int64, 不支持uint64):

41位存时间戳(time),从2019.01.25开始计算,可用69年
10位存机器id(workerId), 每个服务要不同,否则可能会产生相同id
2位预留(ReserveId),可用于标识业务线
2位存异常标识(abnormalityId),用于系统时间回退等异常,运行时可自动恢复
8位存同一毫秒内的递增值(sequence number), 意味着系统1s内并发仅有(2^8 - 1)*1000=255000,同1毫秒内此值溢出时,系统会休眠1毫秒,扩大此值能有效提高系统并发

用法

import github.com/caitinggui/uniqueid
// 此处可从MySQL或者zookeeper等获取到当前的worker id
var WorkerId uint16 = 2
var ReserveId uint8 = 0
sf := uniqueid.NewUniqueId(WorkerId, ReserveId)
uid, err := sf.NextId()
if err != nil {
    panic(err)
}

性能

仅对比不同位数的sequence对uid生成的影响

在sequence number为15位时:

goos: darwin
goarch: amd64
pkg: uniqueid
BenchmarkNextId-4       20000000            81.3 ns/op
PASS

在sequence number为8位时:

goos: darwin
goarch: amd64
pkg: uniqueid
BenchmarkNextId-4         300000          4518 ns/op
PASS

Documentation

Index

Constants

View Source
const (
	BitLenTime        = 41 // 41位存时间戳,大约可用69年
	BitLenWorker      = 10 // 11位存机器id
	BitLenReserve     = 2  // 2位预留,可用于业务编码
	BitLenAbnormality = 2  // 2位用于时间回退等异常情况,运行时可恢复
	BitLenSequence    = 8  // 8位用户1毫秒内的递增值,意味着系统1s内并发在(2^8-1)*1000=255000
	BitLenTotal       = BitLenTime + BitLenWorker + BitLenReserve + BitLenAbnormality + BitLenSequence
)

Variables

View Source
var (
	StartTime = time.Date(2019, 1, 25, 0, 0, 0, 0, time.UTC).UnixNano() / nano // 起始时间,更改可能会导致id重复

)

Functions

func Prase

func Prase(uid uint64) map[string]uint64

解析id的含义

Types

type UniqueId

type UniqueId struct {
	// contains filtered or unexported fields
}

func NewUniqueId

func NewUniqueId(WorkerId uint16, ReserveId uint8) *UniqueId

返回id生成器的实例 配置 WorkerId 机器id; ReserveId 预留的值,可以是业务编码

func (*UniqueId) NextId

func (self *UniqueId) NextId() (uid uint64, err error)

生成下一个unique id,如果该毫秒内的id数超过sequence的最大值,就报错

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL