厉害了!百度开源的分布式唯一ID生成器UidGenerator分分钟解决时钟回拨问题

UidGenerator是百度开源的Java语言实现,基于Snowflake算法的唯一ID生成器。而且,它非常适合虚拟环境,比如:Docker。另外,它通过消费未来时间克服了雪花算法的并发限制。UidGenerator提前生成ID并缓存在RingBuffer中。 检测结果显示,单个实例的QPS能超过6000,000。

依赖环境:

  • JDK8+
  • MySQL(用于分配WorkerId)

snowflake

由下图可知,雪花算法的几个核心组成部分:

  • 1为sign标识位;
  • 41位时间戳;
  • 10位workId(数据中心+工作机器,可以其他组成方式);
  • 12位自增序列;

百度开源的分布式唯一ID生成器UidGenerator,解决了时钟回拨问题

 

但是百度对这些组成部分稍微调整了一下:

百度开源的分布式唯一ID生成器UidGenerator,解决了时钟回拨问题

 

由上图可知,UidGenerator的时间部分只有28位,这就意味着UidGenerator默认只能承受8.5年(2^28-1/86400/365)。当然,根据你业务的需求,UidGenerator可以适当调整delta seconds、worker node id和sequence占用位数。

接下来分析百度UidGenerator的实现。需要说明的是UidGenerator有两种方式提供:和DefaultUidGenerator和CachedUidGenerator。我们先分析比较容易理解的DefaultUidGenerator。

DefaultUidGenerator

delta seconds

这个值是指当前时间与epoch时间的时间差,且单位为秒。epoch时间就是指集成UidGenerator生成分布式ID服务第一次上线的时间,可配置,也一定要根据你的上线时间进行配置,因为默认的epoch时间可是2016-09-20,不配置的话,会浪费好几年的可用时

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成年月日加6位流水唯一 ID,可以考虑使用 Snowflake 算法。Snowflake 算法是 Twitter 开源分布式 ID 生成算法,使用一个 64 位的 long 型数字作为全局唯一 ID。具体实现可以使用 Java 来完成。 在 Java 中,可以使用 Snowflake 算法实现一个分布式 ID 生成器,具体步骤如下: 1. 定义一个 Snowflake 类,包含以下属性: - 起始的时间戳(epoch) - 机器 ID - 序列号 2. 在 Snowflake 类中实现一个 nextId() 方法,该方法包含以下步骤: - 获取当前时间戳(毫秒级) - 如果当前时间戳小于上一次生成 ID 的时间戳,则说明系统时钟退过,抛出异常 - 如果当前时间戳等于上一次生成 ID 的时间戳,则将序列号加 1 - 如果当前时间戳大于上一次生成 ID 的时间戳,则将序列号重置为 0,并更新上一次生成 ID 的时间戳为当前时间戳 - 生成一个 64 位的 long 型数字,其中高位为当前时间戳,中间位为机器 ID,低位为序列号 - 返生成的 ID 3. 在应用程序中使用 Snowflake 类的 nextId() 方法生成唯一 ID。 由于 Snowflake 算法生成的 ID 中包含时间戳信息,因此可以保证生成的 ID 有序递增。同时,Snowflake 算法中使用了位运算和异或运算,可以保证在分布式环境下生成的 ID 不重复。 如果要使用 Snowflake 算法实现分布式并发,需要注意以下几点: - 每个机器的机器 ID 必须唯一 - 同一机器上的线程调用 nextId() 方法时,需要考虑线程安全问题 - 不同机器上的应用程序调用 nextId() 方法时,需要考虑网络延迟和时钟不同步问题 以上是使用 Java 实现年月日加6位流水唯一 ID 的思路,具体实现可以参考 Snowflake 算法的开源实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值