已有的方案:

可大致分为:

完全依赖关系/非关系型数据库递增的方案

完全不依赖数据源作为生成因子的UUID

半依赖数据源作为生成因子的snowflake

为什么推荐snowflake?

这个问题,可以从前两个方案的缺点来讲。

完全依赖关系/非关系型数据库递增的方案:

关系/非关系的区别细节就不展开了,只说说关系型。它最大的缺点是并发的瓶颈,其次是拓展性的问题,再就是还需要考虑数据库的可用性。

噢对了高可用也挺难搞的,不是说难度哈,只是这玩意是真滴麻烦啊,因为一般来说也得双写部署,不然挂掉一个master怎么办,对吧?那双写之后还需要给master配上中间件吧?噢中间件也需要高可用吧?好吧那最后还需要上个nginx或者keepalived…到了这里回头一看“完了我只想生成一个ID而已为什么还要增加那么多东西,需要额外考虑那么多东西?真蛋疼”。所以毙掉这个方案!

UUID:

UUID,神奇的东西(我没仔细研究,所以用“神奇”这个词来蒙混过去),无需数据源作为生成因子却能生成全球唯一ID。屌哇!但是用它作为ID的话还是太大了,16个字节啊,浪费空间不说还影响索引的效率。

不过最大的缺点还不是它的大小,而是它是生成的ID是无序的,但是主流的数据库的索引数据结构都是B+树结构,所以你明白了吧。(这里不懂的朋友请自行搜索 B+树分裂问题 ,我没有能力在三言两语内解释清楚)

所以什么是snowflake?

snowflake 算法是 twitter 开源的分布式 id 生成算法,采用 Scala 语言实现,是把一个 64 位的 long 型的 id,1 个 bit 是不用的,用其中的 41 bits 作为毫秒数,用 10 bits 作为工作机器 id,12 bits 作为序列号。(这句话是复制来的)

snowflake算法生成的ID的结构:

总共64bit,刚好是一个long类型的大小

符号位:符号位是不用的,因为ID只考虑正数。

时间戳:注意是精度为毫秒级的,而不是秒级的。

区域ID:也叫数据中心ID,标识机器所属的数据中心。

机器ID:配合区域ID,用作定位某区域的机房里的其中一台机器。

序列号:看到这里你可能已经明白了,时间戳标记了时间,区域和机器ID标记了机器所属,那么在一个时间单位里,同一台机器请求多个ID怎么办?对,所以需要序列号的递增作为ID的递增生成因子。

算法思路:

如果是在同一时间单位内,则递增序列号作为ID生成因子,直至0 ~ 2^12-1 (0到4095)所有数字用完了,或者检测到时间戳更新了的时候,才将序列号归零重新递增。按照这个思路就可以做出理论上并发为 (2^12-1)(2^10)≈4,200,000 的ID生成算法了。很简单吧。我感觉就并发能力而言,这个算法可以用到死了。

(注意,区域/机器ID不是由snowflake生成的,而是让各个机器在需要时主动调用该生成算法,在调用时传入区域/机器ID作为分布式全局唯一ID的生成因子之一。)

算法的实现

测试结果

我的机器性能不足,加上目前只是单线程测试,所以你会看到图一开头就几个sequenceID都是0,那是因为时间戳更新后sequenceID归零了。

图二可以看到,单位时间内我机子的性能最多叠加到29。改天再做个多线程测试。完

java 唯一id生成算法_分布式全局唯一ID生成方案之snowflake算法相关推荐

  1. [分布式] ------ 全局唯一id生成之雪花算法(Twitter_Snowflake)

    雪花算法(Twitter_Snowflake) 我们知道,分布式全局唯一id的生成,一般是以下几种: 基于雪花算法生成 基于数据库 基于redis 基于zookeeper 本文说下雪花算法,后面附源码 ...

  2. c#获取对象的唯一标识_在 Java 中利用 redis 实现分布式全局唯一标识服务

    作者: 杨高超 juejin.im/post/5a4984265188252b145b643e 获取全局唯一标识的方法介绍 在一个IT系统中,获取一个对象的唯一标识符是一个普遍的需求.在以前的单体应用 ...

  3. 根据时间戳生成编号_分布式系统的唯一ID生成算法对比

    在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. 那么如何实现全局唯一id呢?有以下几种方案. (1)方案一:独立数据库自增id 这个方案就是说你的系统每次要生成一个id,都是往一个独立库 ...

  4. 分布式全局唯一ID的实现

    分布式全局唯一ID的实现 前言 上周末考完试,这周正好把工作整理整理,然后也把之前的一些素材,整理一番,也当自己再学习一番. 一方面正好最近看到几篇这方面的文章,另一方面也是正好工作上有所涉及,所以决 ...

  5. Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案

    Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案 参考文章: (1)Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案 (2)https://www.cnblogs.com/ ...

  6. 分布式系统漫谈【拾】_分布式事务一致性:阿里方案

    上篇文章:分布式系统漫谈[玖]_分布式事务一致性:协议支持 其实对于生产环境的分布式事务一致,各大互联网公司都是自己实现的解决方案,总结起来无非是异步.补偿.实时查询.定期校对几种模式,大部分场景都是 ...

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

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

  8. 分布式全局唯一ID生成算法(改进的雪花算法——解决时钟回拨问题)

    改进的雪花算法--解决时钟回拨问题 原创 公众号: 软件设计活跃区 改进的雪花算法--姑且称为梨花算法吧(忽如一夜春风来,千树万树梨花开). 改进目标:解决雪花算法的时钟回拨问题:部分避免机器id重复 ...

  9. 微服务架构分布式全局唯一ID生成策略及算法

    全局唯一的 ID 几乎是所有系统都会遇到的刚需.这个 id 在搜索, 存储数据, 加快检索速度 等等很多方面都有着重要的意义.工业上有多种策略来获取这个全局唯一的id,针对常见的几种场景,我在这里进行 ...

最新文章

  1. ubuntu下使用apt安装mysql_Ubuntu下通过apt包管理安装mysql
  2. muse ui tabs背景颜色字体颜色
  3. WPF 用装饰器制作抽屉效果
  4. java中wait的场景,wait——webdriver实用指南java版
  5. @bean注解和@component注解的区别_通过源码查看 @Component,@Service 等注解是如何被解析的...
  6. SpringBoot 实现Session共享
  7. 【build your own xxx】实现你自己的bind函数
  8. ActionScript 3.0编译器编译错误大全【转】
  9. 大数据之_亿级分布式日志管理ELK_工作笔记001_ELK认识介绍
  10. AI为癌细胞杀手“染色”,辅助医生选择治疗方案 | 附论文
  11. 重启iis与mysql服务器吗_每晚定时重启IIS和数据库服务可节省服务器资源
  12. 程序员面试金典——1.3确定两串乱序同构
  13. 悟透JavaScript--可爱与智慧并存,灵感与诙谐共生
  14. sose会议级别_【2017年整理】计算机领域EI和SCI收录期刊、影响因子及国际会议.doc...
  15. 22.11.16 IO day 8
  16. 安卓手机设置指定文件夹下的图片、视频不被相册读取到
  17. 暴力破解Wi-Fi密码(Mac M1)
  18. 为什么我加了过滤器然后就登不进去了_石英砂过滤器和活性炭过滤器应用区别...
  19. 启动Vue项目发生的错误总结
  20. 刺激战场android闪退,刺激战场闪退怎么办

热门文章

  1. 基于BP神经网络+HOG特征提取的视频中车辆车牌识别算法仿真
  2. HDB3的matlab编译码
  3. 使用noode.js创建一个服务器
  4. 使用PyCharm创建Django项目及基本配置
  5. android 打包出现错误Error: ResourceName
  6. 洛谷P1202 [USACO1.1]黑色星期五Friday the Thirteenth
  7. 二维树状数组 BZOJ 1452 [JSOI2009]Count
  8. 关于Core Data的一些整理(一)
  9. Android典型界面设计(8) ——ViewPager+PagerSlidingTabStrip实现双导航
  10. 每个软件工程师都应该尝试的5件事