今天介绍的雪花算法:Snowflake,可以让负责生成分布式 ID 的每台机器在每毫秒内生成不一样的 ID。Snowflake 是 Twitter 开源的分布式 ID 生成算法,它不依赖数据库。

核心思想是:分布式 ID 固定是一个 long 型的数字,一个 long 型占8个字节,也就是64个bit,原始 Snowflake 算法中对于 bit 的分配如下图:

雪花算法

第1个 bit 位是标识部分,在 java 中由于 long 的最高位是符号位,正数是0,负数是1,一般生成的 ID 为正数,所以固定为0;

时间戳部分占41 bit,这个是毫秒级的时间,一般实现上不会存储当前的时间戳,而是时间戳的差值(当前时间-固定的开始时间),这样可以使产生的ID从更小值开始;41位的时间戳可以使用69年,(1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69年;

工作机器id占10 bit,这里比较灵活,比如,可以使用前5位作为数据中心机房标识,后5位作为单机房机器标识,算下来可以部署1024个节点;

序列号部分占12 bit,支持同一毫秒内同一个节点可以生成4096个 ID

根据这个算法的逻辑,只需要将这个算法用编程语言实现出来,封装为一个工具方法,那么各个业务应用可以直接使用该工具方法来获取分布式 ID,我们只需保证每个业务应用有自己的工作机器 ID 即可,而不需要单独去搭建获取分布式 ID 的应用。

Snowflake 算法实现起来并不难,这里提供一个 Github 上的 Java 实现版本:SnowFlake

不过国内的很多大厂,其实并没有直接使用 Snowflake 原始算法,多多少少都进行了改造,因为 Snowflake 算法中最难实践的就是工作机器 Id,原始的 Snowflake 算法需要人工去为每台机器指定一个机器 Id 并配置在某个地方,从而让 Snowflake 可以从此处获取机器 Id。但是对于大厂来说,机器是很多的,这样做的人力成本太大,且容易出错,因此才会对 Snowflake 进行改造。

mysql 主键设计 雪花算法_数据库 ID 生成方案:雪花算法相关推荐

  1. mysql主键干嘛的_数据库表中的主键有什么作用?

    展开全部 数据库主键 主键:表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行.这样e69da5e6ba9062616964757a686964616f31333365643534的一列或多列 ...

  2. MySQL主键设计盘点

    文章目录 主键定义 主键设计和应用原则 主键生成策略 自增ID UUID 自建的id生成器 Twitter的snowflake算法 最近在项目中用了UUID的方式生成主键,一开始只是想把这种UUID的 ...

  3. Mysql主键设计-转拉钩教育

    工程上的表结构设计实战 真实的业务场景是工程实现,表结构设计做好以下几点就已经足够: 每张表一定要有一个主键(方法有自增主键设计.UUID 主键设计.业务自定义生成主键): 消除冗余数据存在的可能. ...

  4. MySQL 数据表主键设计,选择自增 id 还是 UUID 还是雪花 id?

    在 MySQL 数据表的设计中,官方推荐我们不要使用 UUID 或者其他不连续不重复的 id,而是推荐使用连续自增的主键 id(auto_increment). 随着现在许多项目都涉及到了分布式或者微 ...

  5. mysql主键被强制定义_主键约束用来强制数据的( )完整性。_学小易找答案

    [其它]上传excel实训3. [单选题]在一张表中可以创建_________个集聚索引. [单选题]日期时间型数据类型(datetime)的长度是( ). [其它]数据分析与函数练习表(控辍表).x ...

  6. mysql主键和唯一索引_主键和唯一索引的有什么区别

    主键和唯一索引的区别 -- 区别 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的. 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键. 唯一性索引列允许空值,而主键列不允许为空值 ...

  7. java不规则算法_分布式id生成算法 snowflake 详解

    背景 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.如在支付流水号.订单号等,随者业务数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需 ...

  8. java 唯一id生成算法_唯一ID生成算法剖析

    在业务开发中,大量场景需要唯一ID来进行标识:用户需要唯一身份标识:商品需要唯一标识:消息需要唯一标识:事件需要唯一标识-等等,都需要全局唯一ID,尤其是分布式场景下. 唯一ID有哪些特性或者说要求呢 ...

  9. 数据库 ID 生成方案:数据库自增

    创建一个数据库实例,在这个实例中新建一个单独的表: 表结构如下: CREATE DATABASE `Test`;CREATE TABLE Test.test01 (id bigint(20) unsi ...

最新文章

  1. 关于vmware虚拟机linux的扩容问题
  2. 【数字信号处理】傅里叶变换性质 ( 频域函数的共轭对称分解 | 序列的傅里叶变换 | 傅里叶变换的共轭对称 | 傅里叶变换的共轭反对称 )
  3. Magento中调用JS文件的几种方法
  4. linux-命令模式-光标定位-编辑中20.22
  5. 《白帽子讲web安全》学习笔记 (3)
  6. 测试管理工具QC第一篇-QC安装步骤(史上最详细的图解过程)-第一篇
  7. 【转】测试用例设计——WEB通用测试用例
  8. go语言中map+stuct结构体是常用的组合
  9. Unity 打包微信
  10. 【Protel】Protel99SE(附汉化包+SP6+增强工具+视频教程)
  11. tftp命令文件传输
  12. SAP GUI登陆系统报Validity of certificate from list with PSE type >SSL错误弹窗
  13. vue.js+socket.io+express+mongodb打造在线聊天[一]
  14. 如何批量生成Flattermarken条码
  15. 解决APP打开后闪退的问题
  16. 关于学习js的一些命令行
  17. Ⅳ JavaScript函数
  18. C++ friend详解
  19. 信号--Signal
  20. 走进你不了解的对日软件外包

热门文章

  1. Photoshop快速把动漫照片转成线描效果
  2. 猿创征文|我的 Java 成长之路
  3. 谷露专访 | CGL 合伙人 Ken Jia - “猎界多面手”的自我修养
  4. Cisco IPPhone XML 技术文档
  5. GPU-Z的像素填充率、纹理填充率、显存带宽计算公式
  6. GlobalObject::CollectGarbage Method
  7. 中证协组织专题座谈会,加快推进区块链技术在证券行业应用
  8. metasploitable3 第一个flag, King of Diamond
  9. C#使用 ComboBox 控件
  10. 计算机维修工培训目标,计算机维修工培训教案【参考】.doc