数据库里的“雪花ID”是什么暗号?一文搞懂分布式主键!

前言

最近在看项目的数据表结构时,发现很多实体关系图(ER图)里,主键字段都写着这样一行注释:
bigint id PK "雪花ID"

无论是角色表、用户角色关联表,还是菜单表,清一色都是它。很多刚接触分布式开发的同学可能会懵:这“雪花ID”是啥暗号?为啥不用传统的 1、2、3、4 自增 ID?

今天就用大白话,给大家科普一下这个业界大名鼎鼎的——雪花算法(Snowflake)

一、为啥叫“雪花ID”?

“雪花ID”并不是什么神秘的暗号,而是来源于 Snowflake(雪花算法)。这个算法最初是由 Twitter(推特)公司开源的,因为他们的 Logo 是一片雪花,所以得名。

它的核心作用就一个:在分布式系统中,生成全局唯一的 ID

你图里看到的 bigint id PK,意思是这个表的主键(PK = Primary Key)是一个长整型数字,而它的值,就是由雪花算法算出来的。

二、雪花ID 是怎么“下雪”的?

雪花算法生成的 ID 是一个 64 位的长整型数字。你可以把它想象成由四部分拼起来的一串数字:

  1. 符号位(1位):固定是 0,保证生成的 ID 是正数。
  2. 时间戳(41位):记录生成 ID 的毫秒级时间。这是核心!意味着 ID 是趋势递增的,你甚至能通过 ID 大小大致推算出数据啥时候创建的。
  3. 机器ID(10位):用来区分不同的服务器。比如你有 10 台服务器,每台分配一个编号,保证它们各自生成的 ID 不会撞车。
  4. 序列号(12位):同一毫秒内,如果并发很高,就靠这个流水号来区分。

打个比方:时间戳是“年月日”,机器ID是“哪个工厂生产的”,序列号是“第几个产品”。组合起来,就像漫天飞舞的雪花——每一片都独一无二

三、为啥不用传统的数据库自增 ID?

早期单体项目里,我们习惯用 id INT AUTO_INCREMENT,从 1 开始往后加。但在现在的微服务、分布式架构下,它就有点力不从心了:

  • 自增 ID 的痛点:如果你把数据分库分表存在多台机器上,A 库自增到 10,B 库也自增到 10,数据一合并,ID 就冲突了。而且每次插入前还要去问数据库“下一个 ID 是多少”,高并发下数据库压力巨大。
  • UUID 的痛点:有人会说用 UUID 啊,肯定不重复。但 UUID 是随机字符串,没有顺序。数据库存主键时通常用 B+ 树索引,随机插入会导致索引树频繁分裂重组,性能掉得一塌糊涂
四、雪花ID 的“降维打击”优势
  1. 全局唯一:自带机器标识,多台服务器同时跑也不怕重复,完美适配分布式。
  2. 趋势递增:因为包含了时间戳,生成的 ID 整体是越来越大、按顺序走的。数据库写入时性能极高,不比自增 ID 差多少。
  3. 不依赖数据库:应用服务在本地内存就能瞬间算出 ID,不用频繁请求数据库,扛得住高并发。
  4. 隐藏信息:对外暴露的 ID 不是连续的数字,防止被恶意爬取(比如通过订单号推测业务量)。
五、总结

所以,下次再看到 ER 图里的 bigint id PK "雪花ID",你就知道:这其实是开发者为了应对高并发、分布式架构,给数据表安排的一个高性能、全局唯一的“身份证号”

它不是暗号,而是现代后端开发的“标配神器”。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值