oracle生成uuid_设计思想赏析分布式id生成算法雪花算法

唯一ID怎么生成?

在数据库的使用中,根据第二范式的设计准则:数据库中的每行必须可以被唯一的区分,因此我们经常需要生成唯一id。在RDBMS(关系数据库管理系统)时代,数据库提供序列生成器,例如oracle的sequence,mysql的increment自增长字段等。RDBMS是中心化环境(单机环境),全局唯一只需要当前机器自己说了算就行;但是在分布式环境(去中心化)下,多台主机并存,如何让他们自动生成全局不会重复的id呢?

f41eeb6c2dd4f6f26b8734a16837f871.png

主要的解决方案有以下两类

5ce2ce1a34387ca7825f72fe04e4e851.png

方法一:仍然采用中心化的思路

    在RDBMS中预生成一批序列,分布式环境中的每个节点启动时到RDBMS中获取一个号段,各自使用。美团leaf的Segment模式就属于此类型。

5ce2ce1a34387ca7825f72fe04e4e851.png

方法二:采用去中心化的思想

    约定一个规则,分布式环境中的每个节点自己生成全局唯一的id即可。UUID、GUID、雪花算法都属于此类情况。

❉❉❉❉❉❉雪花算法❉❉❉❉❉❉

f41eeb6c2dd4f6f26b8734a16837f871.png

9d7cca68f44f6eed8bf0951f7279713f.png

其实很多创新方法都非常简单,雪花算法也是如此。我们需要学习其设计思想,在分布式环境中的id都可以套用此方法。

雪花算法是由Twitter开源的,设定64个bit【思考:为什么是64位?】,由首位、时间戳、机器id和自增序列四部分组成。

  • 首位,1个bit,固定为0;【思考:为什么首位为0?】

  • 时间戳,41个bit,当前时间与指定日期的毫秒级时间差;【思考:为什么是时间差?】

  • 集群节点id,10个bit,最多2^10,共计1024台机器;

  • 自增序列,12个bit,最多2^12,共计4096个id。

天下没有两片相同的雪花

     每个节点在生成id时,会因为时间戳和自增序列的不同,生成的id局部唯一;加上集群节点id,自然就做到了全局唯一,因此雪花算法做到了“天下没有两片相同的雪花”的目的。

f20d76cd80a30c50e40cf56dc1ba585f.png

     同时,时间戳按毫秒计,每毫秒最多可支持4096个id,因此,每个节点每秒可生成4096000个id,且生成的id在(2^41-1)/86400/365/1000=69年之后才会超出41位,应对多大的量都够用了。

设计核心

所以其设计的核心是:

1、  循环使用的自增id,保证某个时间内局部唯一;

2、毫秒级时间戳,提供秒级生成大量id,应对高请求;

3、集群节点id,保证全局唯一。

f41eeb6c2dd4f6f26b8734a16837f871.png

      设计思想明白了,就可以进行相应改良。例如百度的集群已经超过1024台了,那该怎么办?

      百度对雪花算法进行了调整,他的uid是1bit首位+28bit时间戳+22bit机器id+13bit序列号。所以百度uid支持2^22=4194304个节点,每个节点每个秒可生成2^13=8192个id。但是时间戳变短了,只能支持到秒级,所以这个算法生成的id,在(2^28-1)/86400/365=8.5年之后就会超出28bit的长度。

      所以,百度的同学,你准备8年半之后要干啥?

3fe1419188253224900d7563b09e2fc0.png

f41eeb6c2dd4f6f26b8734a16837f871.png

拓展:雪花算法会遇到什么问题?有什么解决办法?还可以应用在哪个场景?

还有,不要忘记↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

4734f3ebf5794ffa93174090ff3e8636.png

点分享

ae69b20153fe50f8cd4e516b15235713.png

点点赞

0dd522a3fe56a00db990d28982bca8d2.png

点在看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值