雪花算法笔记

7 篇文章 0 订阅

雪花算法

Twitter开源的分布式ID生成算法,结果是一个Long型的ID,核心思想是: 使用41bit作为毫秒数,10bit作为机器的ID(5bit是数据中心,5bit是机器ID),12bit是毫秒内的流水号,还有1bit是符号位,永远是0

在这里插入图片描述

方案优势劣势
redis(INCR)生成一个全局连续递增的数字类型的主键增加了一个外部组件的依赖,Redis不可用,则整个数据库将无法再插入
UUID全局唯一,MySQL也有UUID实现36个字符组成,占用空间大
雪花算法全局唯一,数字类型,存储成本低,数值含义机器规模大于1024台无法支持,时钟回拨

可在@TableId注解中指定Id生成策略

@TableId(value = "id", type = IdType.AUTO)
// IdType.AUTO 数据库ID自增
// IdType.NONE 该类型为未设置主键类型
// IdType.INPUT 该类型可以通过自己注册自动填充插件进行填充
// IdType.ASSIGN_ID 使用雪花算法分配Id
// TdType.ASSIGN_UUID 分配UUID

时钟回拨问题

由于雪花算法是依赖于服务器的时间的,所以如果机器发生了故障或者别的情况,对服务器的时间进行了回拨,那么会生成的ID可能会发生重复

解决方案

保存过去一段时间内每一台机器在当前这一毫秒产生的ID的最大值,比如使用Map形势,就是<machine_id,max_id>,这样如果某台机器发生了时间回拨,直接在这台机器对应的max_id的基础上继续自增生成ID即可

接在这台机器对应的max_id的基础上继续自增生成ID即可

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值