zheng-ji / gosnowflake Goto Github PK
View Code? Open in Web Editor NEW一个实现 Twitter SnowFlake 算法 的 Go 分布式 UID 生成器.A threadsafe unique ID generator inspired by Twitter SnowFlake theory
License: MIT License
一个实现 Twitter SnowFlake 算法 的 Go 分布式 UID 生成器.A threadsafe unique ID generator inspired by Twitter SnowFlake theory
License: MIT License
这样id生成器的有效时间能够更长一些。
求解答,我看到之前closed的issue里有相关问题,但是好像木有人进行解答~~
集群环境部署,如何保证时间同步
感觉snowflake的算法挺强大的。但有时候我发现datacenterid和workerid有时候并不需要这么多位,时间戳的位数和序号的位数要是可调的就好了,就写了个各个位数可调的自己玩玩
https://github.com/liuyongshuai/goutils/tree/master/snowflake
自己测了下,目前暂时没发现问题。
另外,你的那个timeReGen()方法是不是还有改进的余地?
window环境下正常,部署到centos下出现了生成ID重复的情况
以下是插入mysql报错日志
[ORM]2018/09/06 11:03:08 -[Queries/default] - [ OK / db.Exec / 0.4ms] - [INSERT INTO pms_groups_permission
(id
, groupid
, permissionid
) VALUES (?, ?, ?)] - 257530689124044800
, 1468755197309162134
, 64815327690625024
[ORM]2018/09/06 11:03:08 -[Queries/default] - [FAIL / db.Exec / 0.2ms] - [INSERT INTO pms_groups_permission
(id
, groupid
, permissionid
) VALUES (?, ?, ?)] - 257530689124044800
, 1468755197309162134
, 42334379363536896
- Error 1062: Duplicate entry '257530689124044800' for key 'PRIMARY'
[ORM]2018/09/06 11:03:08 -[Queries/default] - [FAIL / db.Exec / 0.2ms] - [INSERT INTO pms_groups_permission
(id
, groupid
, permissionid
) VALUES (?, ?, ?)] - 257530689124044800
, 1468755197309162134
, 42334539376234496
- Error 1062: Duplicate entry '257530689124044800' for key 'PRIMARY'
生成ID代码:
func SnowFlakeId() int64 {
iw, _ := goSnowFlake.NewIdWorker(1)
if id, err := iw.NextId(); err != nil {
return 0
} else {
return id
}
}
在uid_test.go的TestSnowFlake里面加对prevId的比较,保证递增,一会就出现了
Maybe add a signature like func (iw *IdWorker) NextIdU64() (ts uint64, err error)
to keep the pkg compatible
Go 我不懂,但是写一些细节的点。。
go-snowflake
更好。如果你看看 Go 的 流行仓库,很少会用驼峰命名法。单个单词、全小写是最佳的,其次是带短减号 -
的命名。也可以考虑跟流行的 Go 库使用类似的命名。
可以参考 LeanCloud 文案风格指南,里面的建议都非常不错。
这次的排版比以前好太多了,但是 README 里还有一些小问题:
项目的描述文字也有类似的问题:
Description 一段的内容跟标题不符。里面只是说明了 ID 的结构,并不适合叫 Description。而且有一些英文表达的问题,比如:
总体看起来不够通顺,可能会影响人们判断你这个库的质量。
最好有个同步的中文文档,方便推广。
不知道 Go 有无生成 UUID 的标准库?或者其他已经流行的第三方库?可以考虑写个性能/功能对比,方便用户选择。
There's something wrong with the for
loop in func (iw *IdWorker) timeReGen(last int64) int64 {...}
There's no loop condition, there's no break or return in the loop's body => it will loop forever!
当时间戳相同时,会消耗seq,当seq消耗殆尽后,需要在reGen里无限循环至生成新的时间戳,但是在timeReGen里,ts默认等于time.Now().UnixNano(),这个要比使用timeGen生成的数值大1000 * 1000倍,所以这个循环无论如何也会直接break
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.