分享
  1. 首页
  2. 文章

全局唯一ID - snowflake

· · 3142 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

为什么需要全局唯一ID

比如以下

分布式下唯一ID

  • 如果数据库分了库/表, 那么表的自增主键就不再唯一, 这时候就需要一个全局唯一的ID生成器才能保证唯一.
  • 可以用来作为事务ID等需要保证唯一的业务 (事务ID可以用来确保幂)

预生成ID

有些业务下需要提前生成唯一ID, 这也是表的自增主键不能满足的需求.

snowflake

生成全局唯一ID有多种方法(可以搜到), 比如使用额外的数据库或者UUID, 但笔者认为性能更好 适用性更广的是snowflake算法.

snowflake是witter开源的分布式ID生成算法, GITHUB在此.

我们如果要在代码中使用还需要根据语言实现它的算法, 笔者使用编程语言是golang, 幸运的是GITHUB上已经有了实现好的库, 如

  • github.com/bwmarrin/snowflake

用法也十分简单, 这里贴上readme-usage看一眼, 更多使用方法请参看官方库-github.com/bwmarrin/snowflake.

package main
import (
 "fmt"
 "github.com/bwmarrin/snowflake"
)
func main() {
 // Create a new Node with a Node number of 1
 node, err := snowflake.NewNode(1)
 if err != nil {
 fmt.Println(err)
 return
 }
 // Generate a snowflake ID.
 id := node.Generate()
 // Print out the ID in a few different ways.
 fmt.Printf("Int64 ID: %d\n", id)
 fmt.Printf("String ID: %s\n", id)
 fmt.Printf("Base2 ID: %s\n", id.Base2())
 fmt.Printf("Base64 ID: %s\n", id.Base64())
 // Print out the ID's timestamp
 fmt.Printf("ID Time : %d\n", id.Time())
 // Print out the ID's node number
 fmt.Printf("ID Node : %d\n", id.Node())
 // Print out the ID's sequence number
 fmt.Printf("ID Step : %d\n", id.Step())
 // Generate and print, all in one.
 fmt.Printf("ID : %d\n", node.Generate().Int64())
}

时钟回拨问题

如果你使用了golang1.9+ 并且使用了最新的bwmarrin/snowflake库, 那么这个问题已经不存在了, 详情看这个issue:
https://github.com/bwmarrin/snowflake/issues/20

这是Golang的提案: Proposal: Monotonic Elapsed Time Measurements in Go


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:

查看原文:全局唯一ID - snowflake

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
3142 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏