Hi!我是小小,我们又见面了,我们今天的话题是六种分布式ID生成算法。

分布式ID简介

什么是分布式ID

在数据量不大的时候,单库单表完全可以支撑现有业务,数据量再大一点搞个MySql主从同步也可以。数据量增长,到后期,需要进行分库分表,显然,这个时候需要一个全局唯一ID,而这个订单号就是分布式ID。

需要满足的条件

  1. 全局唯一

  2. 高可用

  3. 高性能

  4. 简单可用

生成方案

UUID/GUID

通用唯一识别码,是用于计算机体系中以识别信息数目的一个128位标识符,通过16个字节来表示。

UUID,可以根据标准方法生成,不依赖中央机构的注册和分配,UUID具有唯一性,这与其他方案有所不同。

GUID有时专指微软对UUID标准的实现,通常表示成32个16进制的数字组成的字符串,实质上还是一个128位长的二进制整数。在windows生态中,经常使用。UUID是由开放软件基金会标准化,作为分布式计算环境的一部分。

UUID的标准包含32个16进位数字,以连字号分为五段,形式为8-4-4-4-12的32个字元,范例550e8400-e29b-41d4-a716-446655440000

在其规范的文本表示中,UUID的16个8位字节表示为32个十六进制的数字,显示在由连字符分割的-的五个组中,8-4-4-4-12总共36个字符,例如

123e4567-e89b-12d3-a456-426655440000
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx

四位数字 M表示 UUID 版本 版本为

  1. "版本1" UUID 是根据时间和节点 ID(通常是MAC地址)生成;

  2. "版本2" UUID是根据标识符(通常是组或用户ID)、时间和节点ID生成;

  3. "版本3" 和 "版本5" 确定性UUID 通过散列 (hashing) 命名空间 (namespace) 标识符和名称生成;

  4. "版本4" UUID 使用随机性或伪随机性生成。

优点

  1. 容易实现,产生快

  2. ID唯一

  3. 无需要中心化服务器

  4. 不会泄露商业机密

缺点

  1. 可读性过差

  2. 占用空间过多。

  3. 影响数据库性能

数据库递增

可以通过关系型数据库的自增主键产生唯一的ID,现在流行的商业数据库都支持自增主键的特性,比如mysql等。

一些nosql数据库也提供类似特性,比如Redis。

优点

  1. 容易产生

  2. 可读性好,容易记住

  3. 存储很小

缺点

  1. 需要中心化的服务器,并且需要处理单节点的问题,而且有性能瓶颈的问题。

  2. 如果ID暴露给公共访问,会泄露商业机密,通过减法获取每日单量

  3. 需要访问一次数据库获取ID

随机数

递增的整数可以用在内部的服务器中,在外部,可以使用随机数解决这个问题。在递增的基础上产生伪随机数,例如skip32.

skip 32  https://github.com/dgryski/go-skip32

可以直接反解码,即,先使用skip32在随机数上再生成随机数,然后通过反解码,获取到原先的随机数。另外还有一个方法,为hashid

https://hashids.org/  hashid

也可以实现混淆Id的方法

优点

  1. 可读性高

  2. 占用存储小,4个字节即可。

  3. 随机,不会泄露机密

缺点

  1. 需要中心化的服务

  2. 需要两步操作

随机字符串

另外一个产生随机ID方法是直接产生一个小的随机的字符串,比如短网址服务中的ID。此方法有hash(MD5) + base62

优点

  1. 短。5个字节可以保存10亿个ID

  2. 可读性高

  3. 随机,不会泄露信息

缺点

  1. ID可能不唯一,需要检查和处理

基于雪花算法(Snowflake)模式

Twitter的snowflake分布式ID的算法是目前广泛使用的分布式ID算法,尽管有很多变种,比如位数的不同,时间片大小不同、node bit数放在最后等各种变种,但是主要思想还是来自于snowflake的思想。同时访问方法也各种个样,比如提供memcached协议访问和Redis协议访问等等。

Twitter在2010年儿童节的时候在官方博客上介绍了snowflake算法snowflake算法采用64bit存储ID, 最高位备用,暂时不使用。接下来的41 bit做时间戳,最小时间单位为毫秒。再接下来的10 bit做机器ID(worker id),然后最后12 bit在单位时间(毫秒)递增。

41 bit表示时间戳大约可以使用69年(2^41 -1), 为了尽可能的表示时间,时间戳可以从第一次部署的时候开始计算,比如2020-02-02 00:00:00, 这样69年内可以无虞。

10 bit区分机器,所以可以支持1024台机器。你也可以把10bit分成两部分,一部分做数据中心的ID,一部分做机器的ID,比如55分的化,可以支持32个数据中心,每个数据中心最多可以支持32台机器。

12 bit自增值可以表示4096的ID,也就是说每台机器每以毫秒最多产生4096个ID,这是它的最大性能。

正如前面所说,时间戳、机器ID、自增ID所占的位数可以根据你实际的情况做调整。

优点

  1. 存储少,8个字节

  2. 可读性高

  3. 性能好,可以去中心化产生ID,也可以独立节点生成

缺点

  1. 时间回拨会产生重复ID

  2. ID生成有规律性,信息容易泄露

MongoDB ObjectID

MongoDB的主键类型ObjectID也是一种ID生成方案,比如5349b4ddd2781d08c09890f3,它看起来是一个包含24个字符的字符串,实际采用12个字节来存储。

它使用4个字节代表时间戳,3个字节代表机器ID,2个字节代表机器进程ID,然后3个字节代表自增值。

相对于snowflake,它采用了更多的存储(多了四个字节),可以容纳更多的信息

优点

  1. 可读性高

  2. 性能好,可以实现去中心化的产生ID,也可以独立节点完成生成。

缺点

  1. 占用存储过多。

  2. 时间回拨会产生重复ID

  3. ID生成有规律,信息容易泄露

关于后期

小小打算未来几天写一篇长篇,系列,关于Redis系列的,深刻,着重讲解关于Redis集群相关系列。计划讲解如下内容

  1. Redis主从同步

  2. Redis Sectinel

  3. Redis Codis

  4. Redis Cluster 这四个部分,将会分为四天讲完。

关于作者

一个生于二线,活在一线的程序猿,我是小小,我们下期再见。下期将会介绍Redis集群相关内容。

小明菜市场

推荐阅读

● 数据结构与算法 | 来来来,让我们重新认识一下什么是树详解 | 求你别用效率低下的I/O了,要不试试这种I/O

● 面试官 | Java转List三种方式,你说说吧。我。。懵逼。啥时候有三种了

● 面试官 | 这位连单点登录都不知道,让他回家等通知去吧

● 问题解决 | maven包冲突了怎么办,这款插件你不容错过

● 必知必会 | 关于Redis缓存这三大问题,必知必会

给我个好看再走好吗?

分布式ID | 这六种分布式ID生成方法,总有一款适合你相关推荐

  1. 外贸找客户的几十种方法,总有一种适合你

    外贸找客户的几十种方法,总有一种适合你 2011年08月20日 1.起步阶段,注册所有的B2B网站,其中有一些是免费的,而且很多,逐个注册自己的公司信息并把产品发布上去,越详细越好,试想如果你是采购商 ...

  2. 祛除装修异味的方法 总有一种适合你!

    大家都需要的小窍门:祛除装修异味的方法 总有一种适合你!       2007-08-28 10:13:37 发表于焦点房地产网-谈房论市-碧桂园温泉小区(梧仗爱街区)论坛brendalee 最好祛除 ...

  3. 怎么把线稿提取出来_PS教程:提取线稿如此简单?三种方法总有一种适合你

    原标题:PS教程:提取线稿如此简单?三种方法总有一种适合你 部落窝教育,每天学习PS独家原创视频 在PS出现之前,如果我们喜欢某个动漫角色大概只能通过临摹的方式将人物线条勾勒出来,但PS的出现将提取线 ...

  4. MapperException: 无法获取实体类xxxxx对应的表名! 三种解决方法,总有一款适合你。

    MapperException: 无法获取实体类xxxxx对应的表名! 三种解决方法,总有一款适合你. 参考文章: (1)MapperException: 无法获取实体类xxxxx对应的表名! 三种解 ...

  5. 计算机一体机无法连接无线网络,惠普打印机连不上无线?这5种无线连接方法,总有一款适合你...

    打印机有无线功能,但却总连不上路由,看着高大上的功能用不上,是不是很捉急? 今天总结了5种打印机连接无线的方法,总有一款适合你~ - 方 1 法 - 在打印机屏幕上配置无线 本方法适用于带有无线网络功 ...

  6. win11卸载软件怎么恢复?5个方法总有一种适合你

    很多电脑用户会通过卸载应用程序文件来腾出更多的磁盘空间,以加快win11的运行速度,即便卸载的可能是以后需要使用的程序,那么不小心将需要的软件卸载了怎么办?win11软件卸载后怎么恢复呢?下面我们一起 ...

  7. 三十六种互联网小技巧总有一款适合你的

    大家好,我是小鱼 今天给大家分享一些实用性的引流推广知识干货 1.QQ号及QQ空间推广:利用QQ号来做推广,首先你要申请一些小号,不断的加人,并利用一切可利用的资源,再加上QQ好友群发软件,群发你的产 ...

  8. 分布式ID(唯一性)的生成方法汇总

    欢迎关注方志朋的博客,回复"666"获面试宝典 在软件研发工程中,经常会遇到系统主键的唯一性问题,尤其是在现如今比较火热的微服务架构中.分布式ID 具备唯一性.高可用性.有序增长等 ...

  9. 【数据分析】八种缺失值处理方法总有一种适合你

    为什么要处理缺失值 这一段完全是废话了.含有缺失数据的样本,你要么删了,要了就填充上什么值.删了就会损失一部分的样本信息,填充要是填充的不合适,会给样本增加噪音. 所以这就是一个选择的问题: 选择删除 ...

最新文章

  1. 进程和线程的一些见解
  2. mybatis,主键返回指的是返回到传入的对象中
  3. JZOJ 3597. 【CQOI2014】危桥
  4. Linux学习:文件描述符相关函数
  5. uboot源码——环境变量
  6. 分享实录 | 企业CICD规模化落地浅析
  7. 提升业务价值 APM应用与整合分享
  8. 港大计算机科学奖学金,香港大学奖学金情况怎么样?
  9. mariadb启动时报错Job for mariadb.service failed because the control process exited with error code....
  10. python3安装与环境配置和pip的基本使用
  11. spring云化架构迁移 (一)
  12. Atitit 法学处罚方式模式 目录 1. 申诫罚、财产罚和能力罚 1 1.1. 申诫罚 (警告和通报批评 ) 1 1.2. 财产罚是指使被处罚人的财产权利和利益受到损害的行政处罚。 2 1.2
  13. Flutter格式化电话号码
  14. Linux 抓包工具 tcpdump
  15. UVA 12676 Inverting Huffman
  16. 各种门锁的内部结构图_有没有这种执手门锁的内部结构图?
  17. mySQL 2008安装MOF无法连接_SQL Server 2008安装失败,提示MOF编译器无法连接WMI服务器,该如何解决.谢谢!...
  18. ORB_SLAM2系列之三:ORB_SLAM2跑RGBD SLAM数据集
  19. IELTS-writing exercise Expository_Text_18
  20. 交大研究生去日本签证攻略

热门文章

  1. PHP读取超大的excel文件数据的方案
  2. 复杂一点的二叉树递归
  3. 前端http请求跨域问题解决
  4. 利用Socketserver实现简单的文件上传
  5. jquery实现输入框动态增减的实例代码
  6. iOS学习之 plist文件的读写
  7. 使用SQL Server 2005作业设置定时任务
  8. 算法高级(38)-短网址(short URL)系统如何实现?
  9. powerDesigner生成excel版本的数据库文件
  10. 计算机c语言期末答案,大学计算机C语言期末考试试题A.doc