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

分布式id探索

一、为什么要使用分布式id?

        随着数据量增加,数据需要进行水平拆分,但表自增id无法满足唯一性;

二、分布式id的特点

        1唯一性

        2 趋势递增、单调递增(数据库中存放的数据结构数据从小到大有序排列),如果id不是单调递增,插入数据时为了维持平衡需要不停的做叶子节点的分裂与合并;

三、常用分布式id生成算法

        1 uuid:32位16进制数字,36个字符;

                优点:性能高,本地生成没有网络消耗;

                缺点:过长不易于存储,信息不安全,基于MAC地址生成可能会造成MAC地址泄露

        2 雪花算法:

        

                第0位:符号位,始终为0,没用

                第1~41位:用来表示时间戳,单位毫秒

                第42~52位:前五位机房id,后五位机器id

                第53~64位:用来表示序列号,序列号为自增,代表单台机器每秒能够产生的最大id 2                                         的12次方=4096;

        优点:毫秒数在高位,自增序列在低位,id趋势递增;不依赖三方系统,稳定性高;

        缺点:强依赖机器时钟,如果机器时钟回拨会导致重复id生成;(解决方法:缓存历史序列号,使用历史序列号直到它耗尽;等待时钟恢复;使用备用时间戳,即将上一次的时间戳加上一个安全间隔,防止重复生成;报警机制,严重时钟回拨时,人工干预;)

        3 mysql用一张表专门生成id(读写磁盘网络开销大扩展性差)

        4 redis生成(redis持久化会有丢失可能重复)

四、美团leaf算法

        1 segment数据库方案,根据数据库中的表进行获取

        批量获取分布式id,每次获取数量自定义;

        缺点:id号不够随机;当批量获取的数据库id用尽时会产生毛刺现象;

        2 雪花算法方案

                依赖zk生成workid解决机器过多的问题;根据不同的方案解决始终回拨问题;

                解决方案,新启动的机器通过拉去所有机器时间计算平均值,并与本机时间戳比较,判断当前时间戳是否符合;(缓存历史序列号,使用历史序列号直到它耗尽;等待时钟恢复;使用备用时间戳,即将上一次的时间戳加上一个安全间隔,防止重复生成;报警机制,严重时钟回拨时,人工干预;)

        


http://www.mrgr.cn/news/90258.html

相关文章:

  • 绕组电感 - Ansys Maxwell 磁通链与电流
  • 简化发票的数字化存储与检索:Java发票查验接口、票据识别
  • Ubuntu禁止内核自动更新
  • PHP中的魔术方法
  • 数据中台是什么?:架构演进、业务整合、方向演进
  • 如何将Excel的表格存为图片?
  • PromptSource官方文档翻译
  • 【报错信息】环境安装、python
  • 【02】RUST项目(Cargo)
  • 微信小程序分包异步化
  • 互联网大厂中面试的高频计算机网络问题及详解
  • 几种3D 旋转 的参数化形式
  • Node.js笔记入门篇
  • 使用 AlexNet 实现图片分类 | PyTorch 深度学习实战
  • Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)
  • 【RabbitMQ重试】重试三次转入死信队列
  • Pdf手册阅读(1)--数字签名篇
  • Ubuntu安装PgSQL17
  • 嵌入式音视频开发(一)ffmpeg框架及内核解析
  • 擎天柱例程35 串口绘图
  • 2025-2-10-4.4 双指针(基础题1)
  • elementplus 使用日期时间选择器,设置可选范围为前后大于2年且只能选择历史时间不能大于当前时间点
  • 【大数据安全分析】为什么要用大数据技术进行安全分析?
  • 2025年前端面试题~ 【前端面试】更新
  • 教程 | MySQL 基本指令指南(附MySQL软件包)
  • 基于Kotlin中Flow扩展重试方法