当前位置: 首页 > backend >正文

分布式ID生成方案详解

分布式ID生成方案详解


一、问题背景


分库分表场景下,传统自增ID会导致不同库/表的ID重复,需要分布式ID生成方案解决以下核心需求:
•全局唯一性:跨数据库/表的ID不重复
•有序性:利于索引优化和范围查询
•高性能:满足高并发场景需求
•高可用:避免单点故障
•可扩展性:支持业务扩容


二、主流解决方案


1. 自增步长调整


实现原理:
•每个分片设置不同的起始值和步长
•示例:3个分片设置步长为3
  - 分片1:1,4,7...
  - 分片2:2,5,8...
  - 分片3:3,6,9...
优点:
•实现简单
•天然有序
缺点:
•无法扩容(步长固定后难以修改)
•数据迁移困难
•不同分片数据量差异大时可能产生ID浪费


2. 号段模式(Segment)


实现原理:
•数据库维护号段表结构:
  ```sql
  CREATE TABLE idsegment (
    biztag VARCHAR(128) PRIMARY KEY,  -- 业务标识
    maxid BIGINT NOT NULL,            -- 当前最大ID
    step INT NOT NULL,                 -- 号段长度
    version BIGINT NOT NULL            -- 乐观锁版本号
  );
  ```
•应用缓存号段范围(如1-1000),用尽后申请新号段
优点:
•数据库压力小(批量获取)
•可自定义步长
缺点:
•存在单点故障风险
•号段耗尽时可能产生短暂延迟
•需要维护版本号保证并发安全


3. UUID方案


实现特点:
•标准格式:32字符16进制字符串(8-4-4-4-12)
•示例:`550e8400-e29b-41d4-a716-446655440000`
优点:
•完全分布式生成
•无网络开销
缺点:
•无序性导致插入性能差(B+树频繁分裂)
•字符串存储空间大(36字节)
•无法保证趋势递增
•索引效率低(建议作为二级索引)
优化方案:
•主键使用自增ID,UUID作为业务唯一标识


4. Redis方案


实现方式:
INCR global:id  # 原子操作生成连续ID
持久化策略:
方式特点风险
RDB定时快照可能丢失最新数据
AOF命令追加恢复速度慢但数据完整

优点:
•高性能(单机10w+ QPS)
•数字类型天然有序
缺点:
•需处理Redis单点问题(推荐集群)
•持久化策略选择影响可靠性


5. 雪花算法(Snowflake)


64位结构:
```
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        时间戳(41bit)                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
时间戳节点ID(10bit)序列号(12bit)

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
```
各字段说明:
•时间戳(41bit):精确到毫秒,可用约69年(从起始时间计算)
•节点ID(10bit):支持1024个节点
•序列号(12bit):每毫秒4096个ID
优点:
•高性能(单机4,096,000 ID/秒)
•趋势递增
•数字类型存储高效
致命问题:
•时间回拨:服务器时间回调导致ID重复
•解决方案:
  - 时钟同步服务(NTP)
  - 短暂回拨等待时钟追平
  - 严重回拨报警人工介入


三、大厂开源方案


四、方案对比

五、选型建议


•中小规模系统:Redis方案(简单高效)
•高并发场景:雪花算法(需解决时间回拨)
•需要弹性扩展:号段模式+数据库集群
•业务隔离需求:多业务使用不同号段biztag


六、未来趋势


1. 混合模式:动态切换号段与雪花算法
2. 去中心化:结合区块链技术实现分布式共识
3. 智能调整:根据业务压力自动调整号段长度
 


 

http://www.xdnf.cn/news/1904.html

相关文章:

  • 软件为什么需要性能测试?软件测试机构性能测试注意事项有哪些?
  • 实时数据驱动未来:谷云科技CDC实时数据集成平台新版本发布
  • JAVA常用分布式锁Redisson
  • 大模型驱动智能服务变革:从全流程赋能到行业纵深落地
  • WHAT - 前端开发书单推荐
  • 带宽?增益带宽积?压摆率?
  • 基于物联网的智能家居安全防护系统设计
  • Java 24 深度解析:云原生时代的性能更新与安全重构
  • 用 Python 打造打篮球字符动画!控制台彩色炫酷输出,抖音搞怪视频灵感还原
  • 基于 Python(selenium) 的今日头条定向爬虫:根据输入的关键词在今日头条上进行搜索,并爬取新闻详情页的内容
  • 大型超市仓储管理5大痛点解析 智能穿梭车如何实现降本增效?
  • 数字后端设计 (五):布线——芯片里的「交通总动员」
  • [自记录]一次Nvidia显卡的AI容器基础镜像制作过程(含Torch版本和ONNXRuntime版本选择)
  • AI新战局:Gemini 2.5 Pro强势挑战OpenAI o3,谁是真“全能”?“锯齿AGI”时代已来临?
  • 快速了解redis,个人笔记
  • CRM管理优化的7个关键指标:提升客户留存率的科学方法
  • 优化算法
  • 文档编辑:reStructuredText全面使用指南 — 第二部分 基础语法
  • 【金仓数据库征文】-《深入探索金仓数据库:从基础到实战》
  • 【贝叶斯定理01】白话贝叶斯(原理篇)
  • MYSQL 常用数值函数 和 条件函数 详解
  • 1、RabbitMQ的概述笔记
  • Linux-06 ubuntu 系统截图软件使用简单记录
  • 百度Create2025 AI开发者大会:模型与应用的未来已来
  • 数智飞轮:AI时代企业增长的核心密码
  • 《免费开放”双刃剑:字节跳动Coze如何撬动AI生态霸权与暗涌危机?》
  • 最火向量数据库Milvus安装使用一条龙!
  • 2025 Java 开发避坑指南:如何避免踩依赖管理的坑?
  • 【C语言练习】003. 声明不同数据类型的变量并赋值
  • 不同ECU(MCU/ZCU/CCU)其部署(实现)的功能存在差异