java批量⽣成订单号_⼀⼝⽓说出9种分布式ID⽣成⽅式,阿⾥
⾯试官都懵了
⼀、为什么要⽤分布式ID?
在说分布式ID的具体实现之前,我们来简单分析⼀下为什么⽤分布式ID?分布式ID应该满⾜哪些特征?
1、什么是分布式ID?
拿MySQL数据库举个栗⼦:
在我们业务数据量不⼤的时候,单库单表完全可以⽀撑现有业务,数据再⼤⼀点搞个MySQL主从同步读写分离也能对付。
但随着数据⽇渐增长,主从同步也扛不住了,就需要对数据库进⾏分库分表,但分库分表后需要有⼀个唯⼀ID来标识⼀条数据,数据库的⾃增ID显然不能满⾜需求;特别⼀点的如订单、优惠券也都需要有唯⼀ID做标识。此时⼀个能够⽣成全局唯⼀ID的系统是⾮常必要的。那么这个全局唯⼀ID就叫分布式ID。
2、那么分布式ID需要满⾜那些条件?
全局唯⼀:必须保证ID是全局性唯⼀的,基本要求
⾼性能:⾼可⽤低延时,ID⽣成响应要块,否则反倒会成为业务瓶颈
⾼可⽤:100%的可⽤性是骗⼈的,但是也要⽆限接近于100%的可⽤性
好接⼊:要秉着拿来即⽤的设计原则,在系统设计和实现上要尽可能的简单
趋势递增:最好趋势递增,这个要求就得看具体业务场景了,⼀般不严格要求
⼆、分布式ID都有哪些⽣成⽅式?
今天主要分析⼀下以下9种,分布式ID⽣成器⽅式以及优缺点:
UUID
数据库⾃增ID
数据库多主模式
号段模式
Redis
雪花算法(SnowFlake)
滴滴出品(TinyID)
百度 (Uidgenerator)
美团(Leaf)
那么它们都是如何实现?以及各⾃有什么优缺点?我们往下看
以上图⽚源⾃⽹络,如有侵权联系删除
当我们需要⼀个ID的时候,向表中插⼊⼀条记录返回主键ID,但这种⽅式有⼀个⽐较致命的缺点,访问量激增时MySQL本⾝就是系统的瓶
mysql删除重复的数据保留一条
这样两个MySQL实例的⾃增ID分别就是:
从上图可以看出,⽔平扩展的数据库集,有利于解决数据库单点压⼒的问题,同时为了ID⽣成特性,将⾃增步长按照机器数量来设置。
等这批号段ID⽤完,再次向数据库申请新号段,对max_id字段做⼀次update操作,update max_id= max_id + step,update成功则说明新号实现需要注意⼀点,要考虑到redis持久化的问题。redis有两种持久化⽅式RDB和AOF
以上图⽚源⾃⽹络,如有侵权联系删除
Snowflake⽣成的是Long类型的ID,⼀个Long类型占8个字节,每个字节占8⽐特,也就是说⼀个Long类型占64个⽐特。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。