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

【算法】生成分布式 ID 的雪花算法

ID 是数据的唯一、不变且不重复的标识,在查询数据库的数据时必须通过 ID 查询,在分布式环境下生成全局唯一的 ID 是一个重要问题。

雪花算法(snowflake)是一种生成分布式环境下全局唯一 ID 的算法,该算法由 Twitter 发明,用于推文 ID 的生成。国内百度的 UidGenerator,美团的 Leaf 对雪花算法进行了优化,也都在 GitHub 上开源了。

一、为什么需要分布式 ID

在单机场景下,我们对 ID 的要求通过 MySQL 的主键自增就可以满足。
但随着系统数据量、并发压力的增加,原本的单机环境无法满足,需要对 MySQL 进行分库分表,对服务器进行分布式部署。此时,仅仅依靠 MySQL 的主键自增就有问题了。假设现在扩至两台数据库服务器,每台服务器的表 table1 上的 ID 都从 1 开始自增,此时就存在 ID 冲突了。当查询表 table1 中 ID = 234 的数据时,无法确定是哪一台服务器上的 ID。

在这里插入图片描述

在分布式环境下,数据遍布在不同服务器上的数据库中,此时我们如何为不同的数据生成全局唯一的主键呢?
答案就是:使用分布式 ID

二、雪花算法的实现

雪花算法生成的 分布式 ID 由四部分组成:

  1. 第一个 bit,恒为 0。
  2. 第 2 ~ 42 个bit,表示时间戳,单位是毫秒
  3. 第 43 ~ 52 个bit,表示机器 ID,最多 1024 个机器节点,这部分可以根据业务不同做修改。
  4. 第 53 ~ 64 个bit,表示序号,即某台机器在这一毫秒内生成的 ID 的序号。可以用这 12 位 bit 区分一毫秒内生成的 ID,最多区分 4096 个不同 ID。

那么在 1ms 时间内,最多可以生成 1024 x 4096 = 4194304 个 ID。

雪花算法的优点自不必多说,生成速度快,可灵活修改,生成 ID 有序递增等。

同时它的显著缺点就是需要解决重复 ID 问题,因为它依赖时间,当机器时间不准时,就可能出现 ID 冲突。

http://www.lryc.cn/news/42822.html

相关文章:

  • Linux系统编程 - 基础IO(IO操作)
  • 基于 Avue 的 CRUD 表格组件封装
  • 树莓派学习笔记(十三)基于框架编写驱动代码
  • vue事件修饰符之.prevent
  • 【SpringCloud AlibabaSentinel实现熔断与限流】
  • 类与对象-封装
  • 【回忆杀】2012年拥有第一台电脑【致逝去的青春】
  • PointNeXt: Revisiting PointNet++ with Improved Training and Scaling Strategies
  • 打印九九乘法表-课后程序(JavaScript前端开发案例教程-黑马程序员编著-第2章-课后作业)
  • 【Linux】基于阻塞队列的生产者消费者模型
  • 【华为OD机试 2023最新 】 真正的密码(C++)
  • 差分算法(蓝桥杯复习+例题讲解+模板c++)
  • CSS+ JS 实现手电筒效果
  • 2021地理设计组二等奖:基于InSAR和指数分析的地面沉降风
  • 计算机操作系统(第四版)第二章进程的描述与控制—课后习题答案
  • CAN通信----电路图
  • Windows系统安装ElasticSearch(一)
  • linux 产生随机数 并遍历
  • 【3.24】Mybatis常见面试题
  • IDEA 热部署,修改代码不用重启项目
  • 将 XLS 转换为 EXE:xlCompiler Crack
  • 【百面成神】spring基础12问,你能坚持到第几问
  • javaSE类和对象(下)
  • 【数据结构】第四站:单链表力扣题(二)
  • KafKa知识汇总
  • 【RV1126】调试GT911,1024x600 7寸 MIPI 电容触摸屏
  • C的强符号/弱符号
  • AD/DA转换(XPT2046)
  • 乐观锁和悲观锁 面试题
  • 【Autoware规控】mpc_follower模型预测控制节点