分布式唯一ID生成方案
在应用程序中,经常需要全局唯一的ID
作为数据库主键。如何生成全局唯一ID?
首先,需要确定全局唯一ID
是整型还是字符串?如果是字符串,那么现有的UUID
就完全满足需求,不需要额外的工作。缺点是字符串作为ID
占用空间大,索引效率比整型低。
如果采用整型作为ID
,那么首先排除掉32
位int类型,因为范围太小,必须使用64
位long
型。
采用整型作为ID
时,如何生成自增、全局唯一且不重复的ID
?
方案一:数据库自增
利用数据库的自增ID
,从1
开始,基本可以做到连续递增。Oracle
可以用SEQUENCE
,MySQL
可以用主键的AUTO_INCREMENT
,虽然不能保证全局唯一,但每个表唯一,也基本满足需求。
数据库自增ID
的缺点是数据在插入前,无法获得ID
。数据在插入后,获取的ID
虽然是唯一的,但一定要等到事务提交后,ID
才算是有效的。有些双向引用的数据,不得不插入后再做一次更新,比较麻烦。
方案二:基于redis生成全局id策略
采用一个集中式ID
生成器,它可以是Redis
,也可以是ZooKeeper
,也可以利用数据库的表记录最后分配的ID
。
这种方式最大的缺点是复杂性太高,需要严重依赖第三方服务,而且代码配置繁琐。一般来说,越是复杂的方案,越不可靠,并且测试越痛苦。
方案二:UUID
UUID
:性能高,本地生成,没有网络消耗。
缺点: 入库性能差。无法预测它的生成顺序,不能生成递增有序的数字,MySQL
推荐主键越短越好,UUID
36字符明显不符合要求。
最重要的是,MySQL
的主键也是索引,MySQL
的索引是通过btree
,每一次新的无序UUID
数据的插入,为了维持顺序,会对bree
进行大量的修改,大大降低了数据库插入的性能。
方案四:Snowflake
类似Twitter
的Snowflake
算法,它给每台机器分配一个唯一标识,然后通过时间戳+标识+自增实现全局唯一ID
。这种方式好处在于ID
生成算法完全是一个无状态机,无网络调用,高效可靠。缺点是如果唯一标识有重复,会造成ID冲突。
Snowflake
算法采用41bit
毫秒时间戳,加上10bit
机器ID
,加上12bit
序列号,理论上最多支持1024
台机器每秒生成4096000个序列号,对于Twitter
的规模来说够用了。
但是对于绝大部分普通应用程序来说,根本不需要每秒超过400万的ID
,机器数量也达不到1024
台,所以,我们可以改进一下,使用更短的ID
生成方式。
分布式唯一ID生成方案相关推荐
- 一线大厂的分布式唯一ID生成方案是什么样的?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 一.前言 分布式系统中我们会对一些数据量大的业务进行分拆,如:用户 ...
- 一起学习下一线大厂的分布式唯一ID生成方案!
来源 | http://www.toutiao.com/i6682672464708764174 一.前言 分布式系统中我们会对一些数据量大的业务进行分拆,如:用户表,订单表.因为数据量巨大一张表无法 ...
- 常用的分布式唯一ID生成方案
全局唯一ID使用场景 分布式系统设计时,数据分片场景下,通常需要一个全局唯一id: 在消息系统中需要消息唯一ID标识来防止消息重复: 多系统打通需要一个全局唯一标识 (如集团各业务线面对不同用户,需要 ...
- mysql 分布式 生成序号_分布式唯一ID生成方案
唯一ID在业务系统中经常用到,例如数据库的唯一主键,那么唯一ID如何生成,我们这里介绍一些常见的实现方案. 字符串ID 如果采用字符串id,那么很简单,直接使用jdk自带的UUID,原始生成的是带中划 ...
- Java架构直通车——分布式唯一 ID生成方案
文章目录 分布式ID的几种生成方案 UUID MySQL主键自增 数据库自增ID改进方案 雪花算法(SnowFlake) 雪花算法的优化 Redis自增id Zookeeper有序节点 最近要做区块链 ...
- Java分布式唯一ID生成方案——比UUID效率更高的生成id工具类
package com.xinyartech.erp.core.util;import java.lang.management.ManagementFactory; import java.net. ...
- 分布式系统唯一ID生成方案浅析
有情怀,有干货,微信搜索[荒古传说]关注这个不一样的程序员. 分布式系统唯一ID生成方案浅析 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.业务ID需要满足的要求如下 全局唯一性:不能出 ...
- 全局唯一ID生成方案
2019独角兽企业重金招聘Python工程师标准>>> 全局唯一ID生成方案对比 - http://cenalulu.github.io/mysql/guid-generate/ 转 ...
- asp按时间自动递增编号_Java秒杀系统实战系列-分布式唯一ID生成订单编号
本文是"Java秒杀系统实战系列文章"的第七篇,在本文中我们将重点介绍 "在高并发,如秒杀的业务场景下如何生成全局唯一.趋势递增的订单编号",我们将介绍两种方法 ...
最新文章
- python怎么知道用哪个库使用-Python绘图库讲解:4大常用库你准备学哪个?
- 第十四章 架构师领导艺术(待续)
- Maven 的 Scope 区别,你知道吗?
- 多线程的操作与数据绑定
- UML建模之业务处理模型(Business Process Model,BPM)
- 6.3、分区表、分区表索引--Oracle模式对象
- codeforces 688 E. The Values You Can Make(01背包+思维)
- pycharm的background task一直更新index,速度慢的解决方法
- 查看postgresql 磁盘占用_一个能融会贯通PostgreSQL监控的人,大概率是高手
- 一个 bootstrap 弹出框插件
- OSPF不规则区域,远离Area 0的区域连通性解决方案
- Word技能-更改 Normal 模板 (Normal.dotm)
- 移动支付的发展优势有哪些?
- js使用tween动画(Tween.js)
- anti-fraud-admin 反欺诈后台
- 桌面html文件图标异常,.htm .html文件图标显示异常的解决办法
- python已知两条直角边求斜边,Python实现“已知三角形两个直角边,求斜边”
- MYSQL——MYSQL中常见的数据库引擎
- 装机防忽悠征文]对付不良商家,攒机知识。
- 层次分析法(正课1)
热门文章
- 沟通的艺术(罗纳德·B·阿德勒/拉塞尔·F·普罗科特)
- JavaScript 判断时间阶段,比如用户输入12点弹出 中午好 用户输入18点 弹出傍晚好 用户输入23点 弹出深夜好
- JAVA智慧防疫上报系统服务端计算机毕业设计Mybatis+系统+数据库+调试部署
- Caffe学习笔记(三)——Matlab接口
- 零基础学Java基础培训还是自学?
- 【附源码】Java计算机毕业设计文具销售系统(程序+LW+部署)
- iOS开发支付篇——内购(IAP)详解
- Java中的Comparable接口和Comparator接口
- C++上机实验,做一个工资管理系统
- Go 1.18 发布了,不用翻墙即可下载!!!