首页
注册
登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请
登录
V2EX
›
wowowo1
›
全部回复第 2 页 / 共 2 页
回复总数
21
1
2
❮
❯
2017-11-20 02:49:50 +08:00
回复了
owenliang
创建的主题
›
Go 编程语言
›
昨晚用 Golang 写了个 ID 生成服务,分享给大家
看了下代码,仿佛核心是先分区( segments ),仿佛也可称为分片,然后根据每个分片根据自己的分区信息自己内部进行 ID 递增。
```
func (alloc *Alloc)NextId() (int64, error) {
alloc.mutex.Lock()
defer alloc.mutex.Unlock()
if len(alloc.segments) > 0 {
id := alloc.segments[0].left + alloc.segments[0].offset
alloc.segments[0].offset++
if id + 1 >= alloc.segments[0].right {
alloc.segments = append(alloc.segments[:0], alloc.segments[1:]...)
}
return id, nil
} else {
return 0, errors.New("no more id")
}
}
```
套用日本中二片里面自吹的话,最简单是 ID 生成器,最难也是 ID 生成器。
如果我理解没错的话,
你这套代码只能保证某个分区内递增,不能保证所有分区一起递增。
每次请求不能落盘,不能记录已分配的 ID,或许可以采用异步解决,但是遇到灾难性故障基本会出现重复的情况。
64 位整形仍然不能保证不重复。
目前来看,UUID 中 snowflake 才是终极方案,自增 ID 仍然数 TIDB 那套比较靠谱,虽然他不能保证连续,但是至少自增。
1
2
❮
❯
关于
·
帮助文档
·
博客
·
API
·
FAQ
·
实用小工具
·
5837 人在线
最高记录 6679
·
Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 12ms ·
UTC 02:00
·
PVG 10:00
·
LAX 18:00
·
JFK 21:00
Developed with
CodeLauncher
♥ Do have faith in what you're doing.