mysql 主键设计 雪花算法_数据库 ID 生成方案:雪花算法
今天介绍的雪花算法: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 生成方案:雪花算法相关推荐
- mysql主键干嘛的_数据库表中的主键有什么作用?
展开全部 数据库主键 主键:表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行.这样e69da5e6ba9062616964757a686964616f31333365643534的一列或多列 ...
- MySQL主键设计盘点
文章目录 主键定义 主键设计和应用原则 主键生成策略 自增ID UUID 自建的id生成器 Twitter的snowflake算法 最近在项目中用了UUID的方式生成主键,一开始只是想把这种UUID的 ...
- Mysql主键设计-转拉钩教育
工程上的表结构设计实战 真实的业务场景是工程实现,表结构设计做好以下几点就已经足够: 每张表一定要有一个主键(方法有自增主键设计.UUID 主键设计.业务自定义生成主键): 消除冗余数据存在的可能. ...
- MySQL 数据表主键设计,选择自增 id 还是 UUID 还是雪花 id?
在 MySQL 数据表的设计中,官方推荐我们不要使用 UUID 或者其他不连续不重复的 id,而是推荐使用连续自增的主键 id(auto_increment). 随着现在许多项目都涉及到了分布式或者微 ...
- mysql主键被强制定义_主键约束用来强制数据的( )完整性。_学小易找答案
[其它]上传excel实训3. [单选题]在一张表中可以创建_________个集聚索引. [单选题]日期时间型数据类型(datetime)的长度是( ). [其它]数据分析与函数练习表(控辍表).x ...
- mysql主键和唯一索引_主键和唯一索引的有什么区别
主键和唯一索引的区别 -- 区别 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的. 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键. 唯一性索引列允许空值,而主键列不允许为空值 ...
- java不规则算法_分布式id生成算法 snowflake 详解
背景 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.如在支付流水号.订单号等,随者业务数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需 ...
- java 唯一id生成算法_唯一ID生成算法剖析
在业务开发中,大量场景需要唯一ID来进行标识:用户需要唯一身份标识:商品需要唯一标识:消息需要唯一标识:事件需要唯一标识-等等,都需要全局唯一ID,尤其是分布式场景下. 唯一ID有哪些特性或者说要求呢 ...
- 数据库 ID 生成方案:数据库自增
创建一个数据库实例,在这个实例中新建一个单独的表: 表结构如下: CREATE DATABASE `Test`;CREATE TABLE Test.test01 (id bigint(20) unsi ...
最新文章
- 关于vmware虚拟机linux的扩容问题
- 【数字信号处理】傅里叶变换性质 ( 频域函数的共轭对称分解 | 序列的傅里叶变换 | 傅里叶变换的共轭对称 | 傅里叶变换的共轭反对称 )
- Magento中调用JS文件的几种方法
- linux-命令模式-光标定位-编辑中20.22
- 《白帽子讲web安全》学习笔记 (3)
- 测试管理工具QC第一篇-QC安装步骤(史上最详细的图解过程)-第一篇
- 【转】测试用例设计——WEB通用测试用例
- go语言中map+stuct结构体是常用的组合
- Unity 打包微信
- 【Protel】Protel99SE(附汉化包+SP6+增强工具+视频教程)
- tftp命令文件传输
- SAP GUI登陆系统报Validity of certificate from list with PSE type >SSL错误弹窗
- vue.js+socket.io+express+mongodb打造在线聊天[一]
- 如何批量生成Flattermarken条码
- 解决APP打开后闪退的问题
- 关于学习js的一些命令行
- Ⅳ JavaScript函数
- C++ friend详解
- 信号--Signal
- 走进你不了解的对日软件外包
热门文章
- Photoshop快速把动漫照片转成线描效果
- 猿创征文|我的 Java 成长之路
- 谷露专访 | CGL 合伙人 Ken Jia - “猎界多面手”的自我修养
- Cisco IPPhone XML 技术文档
- GPU-Z的像素填充率、纹理填充率、显存带宽计算公式
- GlobalObject::CollectGarbage Method
- 中证协组织专题座谈会,加快推进区块链技术在证券行业应用
- metasploitable3 第一个flag, King of Diamond
- C#使用 ComboBox 控件
- 计算机维修工培训目标,计算机维修工培训教案【参考】.doc