前言
最近在看项目的数据表结构时,发现很多实体关系图(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位):固定是 0,保证生成的 ID 是正数。
- 时间戳(41位):记录生成 ID 的毫秒级时间。这是核心!意味着 ID 是趋势递增的,你甚至能通过 ID 大小大致推算出数据啥时候创建的。
- 机器ID(10位):用来区分不同的服务器。比如你有 10 台服务器,每台分配一个编号,保证它们各自生成的 ID 不会撞车。
- 序列号(12位):同一毫秒内,如果并发很高,就靠这个流水号来区分。
打个比方:时间戳是“年月日”,机器ID是“哪个工厂生产的”,序列号是“第几个产品”。组合起来,就像漫天飞舞的雪花——每一片都独一无二。
三、为啥不用传统的数据库自增 ID?
早期单体项目里,我们习惯用 id INT AUTO_INCREMENT,从 1 开始往后加。但在现在的微服务、分布式架构下,它就有点力不从心了:
- 自增 ID 的痛点:如果你把数据分库分表存在多台机器上,A 库自增到 10,B 库也自增到 10,数据一合并,ID 就冲突了。而且每次插入前还要去问数据库“下一个 ID 是多少”,高并发下数据库压力巨大。
- UUID 的痛点:有人会说用 UUID 啊,肯定不重复。但 UUID 是随机字符串,没有顺序。数据库存主键时通常用 B+ 树索引,随机插入会导致索引树频繁分裂重组,性能掉得一塌糊涂。
四、雪花ID 的“降维打击”优势
- 全局唯一:自带机器标识,多台服务器同时跑也不怕重复,完美适配分布式。
- 趋势递增:因为包含了时间戳,生成的 ID 整体是越来越大、按顺序走的。数据库写入时性能极高,不比自增 ID 差多少。
- 不依赖数据库:应用服务在本地内存就能瞬间算出 ID,不用频繁请求数据库,扛得住高并发。
- 隐藏信息:对外暴露的 ID 不是连续的数字,防止被恶意爬取(比如通过订单号推测业务量)。
五、总结
所以,下次再看到 ER 图里的 bigint id PK "雪花ID",你就知道:这其实是开发者为了应对高并发、分布式架构,给数据表安排的一个高性能、全局唯一的“身份证号”。
它不是暗号,而是现代后端开发的“标配神器”。

5512

被折叠的 条评论
为什么被折叠?



