​ 在应用程序中,经常需要全局唯一的ID作为数据库主键。如何生成全局唯一ID?

​ 首先,需要确定全局唯一ID是整型还是字符串?如果是字符串,那么现有的UUID就完全满足需求,不需要额外的工作。缺点是字符串作为ID占用空间大,索引效率比整型低。

​ 如果采用整型作为ID,那么首先排除掉32位int类型,因为范围太小,必须使用64long型。

​ 采用整型作为ID时,如何生成自增、全局唯一且不重复的ID

方案一:数据库自增

​ 利用数据库的自增ID,从1开始,基本可以做到连续递增。Oracle可以用SEQUENCEMySQL可以用主键的AUTO_INCREMENT,虽然不能保证全局唯一,但每个表唯一,也基本满足需求。

​ 数据库自增ID的缺点是数据在插入前,无法获得ID。数据在插入后,获取的ID虽然是唯一的,但一定要等到事务提交后,ID才算是有效的。有些双向引用的数据,不得不插入后再做一次更新,比较麻烦。

方案二:基于redis生成全局id策略

​ 采用一个集中式ID生成器,它可以是Redis,也可以是ZooKeeper,也可以利用数据库的表记录最后分配的ID

​ 这种方式最大的缺点是复杂性太高,需要严重依赖第三方服务,而且代码配置繁琐。一般来说,越是复杂的方案,越不可靠,并且测试越痛苦。

方案二:UUID

UUID:性能高,本地生成,没有网络消耗。

缺点: 入库性能差。无法预测它的生成顺序,不能生成递增有序的数字,MySQL推荐主键越短越好,UUID36字符明显不符合要求。

最重要的是,MySQL的主键也是索引,MySQL的索引是通过btree,每一次新的无序UUID数据的插入,为了维持顺序,会对bree进行大量的修改,大大降低了数据库插入的性能。

方案四:Snowflake

​ 类似TwitterSnowflake算法,它给每台机器分配一个唯一标识,然后通过时间戳+标识+自增实现全局唯一ID。这种方式好处在于ID生成算法完全是一个无状态机,无网络调用,高效可靠。缺点是如果唯一标识有重复,会造成ID冲突。

Snowflake算法采用41bit毫秒时间戳,加上10bit机器ID,加上12bit序列号,理论上最多支持1024台机器每秒生成4096000个序列号,对于Twitter的规模来说够用了。

​ 但是对于绝大部分普通应用程序来说,根本不需要每秒超过400万的ID,机器数量也达不到1024台,所以,我们可以改进一下,使用更短的ID生成方式。

分布式唯一ID生成方案相关推荐

  1. 一线大厂的分布式唯一ID生成方案是什么样的?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 一.前言 分布式系统中我们会对一些数据量大的业务进行分拆,如:用户 ...

  2. 一起学习下一线大厂的分布式唯一ID生成方案!

    来源 | http://www.toutiao.com/i6682672464708764174 一.前言 分布式系统中我们会对一些数据量大的业务进行分拆,如:用户表,订单表.因为数据量巨大一张表无法 ...

  3. 常用的分布式唯一ID生成方案

    全局唯一ID使用场景 分布式系统设计时,数据分片场景下,通常需要一个全局唯一id: 在消息系统中需要消息唯一ID标识来防止消息重复: 多系统打通需要一个全局唯一标识 (如集团各业务线面对不同用户,需要 ...

  4. mysql 分布式 生成序号_分布式唯一ID生成方案

    唯一ID在业务系统中经常用到,例如数据库的唯一主键,那么唯一ID如何生成,我们这里介绍一些常见的实现方案. 字符串ID 如果采用字符串id,那么很简单,直接使用jdk自带的UUID,原始生成的是带中划 ...

  5. Java架构直通车——分布式唯一 ID生成方案

    文章目录 分布式ID的几种生成方案 UUID MySQL主键自增 数据库自增ID改进方案 雪花算法(SnowFlake) 雪花算法的优化 Redis自增id Zookeeper有序节点 最近要做区块链 ...

  6. Java分布式唯一ID生成方案——比UUID效率更高的生成id工具类

    package com.xinyartech.erp.core.util;import java.lang.management.ManagementFactory; import java.net. ...

  7. 分布式系统唯一ID生成方案浅析

    有情怀,有干货,微信搜索[荒古传说]关注这个不一样的程序员. 分布式系统唯一ID生成方案浅析 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.业务ID需要满足的要求如下 全局唯一性:不能出 ...

  8. 全局唯一ID生成方案

    2019独角兽企业重金招聘Python工程师标准>>> 全局唯一ID生成方案对比 - http://cenalulu.github.io/mysql/guid-generate/ 转 ...

  9. asp按时间自动递增编号_Java秒杀系统实战系列-分布式唯一ID生成订单编号

    本文是"Java秒杀系统实战系列文章"的第七篇,在本文中我们将重点介绍 "在高并发,如秒杀的业务场景下如何生成全局唯一.趋势递增的订单编号",我们将介绍两种方法 ...

最新文章

  1. python怎么知道用哪个库使用-Python绘图库讲解:4大常用库你准备学哪个?
  2. 第十四章 架构师领导艺术(待续)
  3. Maven 的 Scope 区别,你知道吗?
  4. 多线程的操作与数据绑定
  5. UML建模之业务处理模型(Business Process Model,BPM)
  6. 6.3、分区表、分区表索引--Oracle模式对象
  7. codeforces 688 E. The Values You Can Make(01背包+思维)
  8. pycharm的background task一直更新index,速度慢的解决方法
  9. 查看postgresql 磁盘占用_一个能融会贯通PostgreSQL监控的人,大概率是高手
  10. 一个 bootstrap 弹出框插件
  11. OSPF不规则区域,远离Area 0的区域连通性解决方案
  12. Word技能-更改 Normal 模板 (Normal.dotm)
  13. 移动支付的发展优势有哪些?
  14. js使用tween动画(Tween.js)
  15. anti-fraud-admin  反欺诈后台
  16. 桌面html文件图标异常,.htm .html文件图标显示异常的解决办法
  17. python已知两条直角边求斜边,Python实现“已知三角形两个直角边,求斜边”
  18. MYSQL——MYSQL中常见的数据库引擎
  19. 装机防忽悠征文]对付不良商家,攒机知识。
  20. 层次分析法(正课1)

热门文章

  1. 沟通的艺术(罗纳德·B·阿德勒/拉塞尔·F·普罗科特)
  2. JavaScript 判断时间阶段,比如用户输入12点弹出 中午好 用户输入18点 弹出傍晚好 用户输入23点 弹出深夜好
  3. JAVA智慧防疫上报系统服务端计算机毕业设计Mybatis+系统+数据库+调试部署
  4. Caffe学习笔记(三)——Matlab接口
  5. 零基础学Java基础培训还是自学?
  6. 【附源码】Java计算机毕业设计文具销售系统(程序+LW+部署)
  7. iOS开发支付篇——内购(IAP)详解
  8. Java中的Comparable接口和Comparator接口
  9. C++上机实验,做一个工资管理系统
  10. Go 1.18 发布了,不用翻墙即可下载!!!