分布式ID

62 篇文章 4 订阅
8 篇文章 1 订阅

我们就拿订单来说
订单数据非常庞大,将来一定会做分库分表。那么这种情况下, 要保证id的唯一,就不能靠数据库自增,而是自己来实现算法,生成唯一id。

雪花算法

用雪花算法生成唯一id:
雪花算法会生成一个64位的二进制数据,为一个Long型。(转换成字符串后长度最多19) ,其基本结构:

第一部分:备用

第二部分:41位为毫秒级时间(41位的长度可以使用69年)

第三部分:5位datacenterId和5位workerId(10位的长度最多支持部署1024个节点)

第四部分:最后12位是毫秒内的计数(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号)

snowflake生成的ID整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和workerId作区分),并且效率较高。经测试snowflake每秒能够产生26万个ID。

全局高并发分布式ID

pom

  <dependency>
      <groupId>com.alanpoi</groupId>
      <artifactId>alanpoi-common</artifactId>
      <version>1.3.0</version>
  </dependency>

使用

  • 单节点可以可以直接使用 ID.getId.next(),多节点也可以使用,不能保证真正的分布式唯一
  • 多节点通过配置alanpoi.serverid.enable=true,或者通过以下配置类Bean开启:
    @Bean(destroyMethod = "destroy")
    public ServerID initServerID(RedisTemplate redisTemplate) {
        ServerID serverID = new ServerID(redisTemplate);
        return serverID;
    }
  • 基础用法,ID.getId().next()、ID.getId.current()

##扩展
集成到Mybatis-plus(baomidou)
前提 :baomidou版本3.3.1.tmp或者以上

    /**
     * 注册ID生成器
     * @return
     */
    @Bean
    public IdentifierGenerator idGenerator() {
        return entity -> ID.getId().next();
    }

配置类中加入上面这段代码,就会自动在实体注入ID属性值了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LC超人在良家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值