0

0

分布式情况下生成数据库唯一ID的解决方案

伊谢尔伦

伊谢尔伦

发布时间:2016-11-21 14:25:56

|

1546人浏览过

|

来源于php中文网

原创

id作为业务的唯一标识,在数据设计中屡见不鲜,例如:

•商品 —— product_id

•订单 —— order_id

•消息 —— message_id

这些标识往往就是数据库的主键,MySQL会在主键是建立聚簇索引,这个索引直接指向数据地址。相比普通索引指向聚簇索引,减少了一次索引查询,速度很快。消息、订单类似业务一般会有按照时间倒序查询数据的需求,一种做法是在时间列上建立索引,更好的是依赖ID本身的插入有序性。所以,分布式ID需要满足两个核心条件:

•全局唯一

•时间趋势有序

可能有人会说了,直接用MySQL的auto_increment不就行了么。在创业初期的时候我也会选择这个方案,简单、高效、快速——创业公司还是得快速迭代,尽快出产品,而且产品经常变,花太多时间搞出的牛逼架构说不定不太用得上,浪费了宝贵的时间。但这个方案是存在一些问题的:

•影响并行插入——B记录依赖A记录的主键,需要等到A记录插入成功,拿到A.id,才能插入B记录

•数据恢复难度大——数据误删或者丢失后,由于日志中没有ID,不能直接确定数据关联性

•影响分库分表——由于ID要插入后才知道,不能根据业务的主键进行分库分表

所以,在业务稳定后,一定要抽出时间来还早期的技术债务。

常见方案

使用数据库的auto_increment来生成唯一ID

优点

•简单,使用已有功能,开发量小

•ID步长固定

缺点

•写入单点,非高可用

•即使按照不同auto_increment起点扩展多个主库,虽然提高了可用性,但却不能保证ID的严格有序

•每次都需要访问数据库,容易到达性能天花板

批量拉取ID,逐一分配

这种方案也是将ID数据存入数据库,ID服务每次从数据库中拉取N个ID,并将当前已用ID最大值更新为原始数据+N,ID服务每次接到ID生成请求时就从这N个ID中依次返回。

优点

•批量获取,不用每次访问数据库,数据库压力小

索特旅游线路发布管理系统VIP版
索特旅游线路发布管理系统VIP版

一套专门解决旅行社网上预定、发布、管理线路的强大系统,系统基于ASP+ACCESS数据库开发,功能强大,操作方便,系统设计完全符合旅行社的运做模式。系统着重体现易操作性,只要您会打字,便操作。系统由以下几个模块组成:1、线路的类别发布和管理2、线路的发布和管理3、线路的属性管理(是精品线路、还是普通线路)4、客户预定线路订单管理,人性化的区分为未处理订但和处理订单5、线路查询功能6、网站留言功能,

下载

缺点

•整个服务还是单点

•服务宕机重启会造成ID不连续

•无法水平扩展

改进

增加一套备用服务,主服务挂了漂移到备用服务上,可以采用vip + keepalived或者增加proxy。

uuid

优点

•本地生成ID,没有单点问题,没有性能瓶颈

缺点

•不能保证递增有序

•长度过长,作为主键性能低

类snowflake算法

snowflake是twitter开源的分布式ID生成算法,其核心思想是:一个long型的ID,使用其中41bit作为毫秒数,10bit作为机器编号,12bit作为毫秒内序列号。这个算法单机每秒内理论上最多可以生成1000*(2^12),也就是400W的ID,完全能满足业务的需求。

借鉴snowflake的思想,结合各公司的业务逻辑和并发量,可以实现自己的分布式ID生成算法。

优点

•时间在高位,趋势递增

•实现简单,不依赖其它服务,方便扩展

缺点

•没有全局时钟,单机绝对有序,但从整个集群来看,是趋势有序的

注意事项

•由于ID常作为分库分表的标识,所以需要这些ID有一定的随机性,不至于分库后的数据不均匀,可以在每个毫秒开始时序列号不从1开始,二是从0-9中的任意一个开始

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 816人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号