iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >mybatis-plus雪花算法自动生成机器id原理的示例分析
  • 295
分享到

mybatis-plus雪花算法自动生成机器id原理的示例分析

2023-06-15 09:06:44 295人浏览 薄情痞子
摘要

这篇文章主要介绍了mybatis-plus雪花算法自动生成机器id原理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、雪花算法原理  &nbs

这篇文章主要介绍了mybatis-plus雪花算法自动生成机器id原理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

1、雪花算法原理

        雪花算法使用一个 64 bit 的 long 型的数字作为全局唯一 id。这 64 个 bit 中,其中 1 个 bit 是不用的,然后用其中的 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号。

mybatis-plus雪花算法自动生成机器id原理的示例分析

  1. 1bit,不用,因为二进制中最高位是符号位,1表示负数,0表示正数。生成的id一般都是用整数,所以最高位固定为0。

  2. 41bit-时间戳,用来记录时间戳,毫秒级。

  3. 10bit-工作机器id,用来记录工作机器id。

  4. 12bit-序列号,序列号,用来记录同毫秒内产生的不同id。即可以用0、1、2、3、…4094这4095个数字,来表示同一机器同一时间截(毫秒)内产生的4095个ID序号。

SnowFlake可以保证:

所有生成的id按时间趋势递增
整个分布式系统内不会产生重复id(因为有datacenterId和workerId来做区分)

        如上大概了解了雪花算法的原理,而且也知道机器号对于雪花算法的重要性。如果机器号一样,可能会出现id重复的情况。

        mybatis-plus自3.3.0开始,默认使用雪花算法+UUID(不含中划线),但是它并没有强制让开发者配置机器号。这一点很是疑惑,这样可能会让不了解雪花算法的人埋下了一个坑。
        但是这么强大的一个框架难道真的没有做优化吗?带着问题,查看了下mybatis-plus雪花算法源码com.baomidou.mybatisplus.core.toolkit.Sequence。最终发现在没有设置机器号的情况下,会通过当前物理网卡地址和jvm的进程ID自动生成。这真的是一个较好的解决方案。一般在一个集群中,Mac+JVM进程PID一样的几率非常小。

2、自动生成唯一机器号源码

核心代码。有两个构造方法,一个无参构造,一个有参构造。

public Sequence() {    //通过当前物理网卡地址获取datacenterId    this.datacenterId = getDatacenterId(maxDatacenterId);    //物理网卡地址+jvm进程pi获取workerId    this.workerId = getMaxWorkerId(datacenterId, maxWorkerId);}public Sequence(long workerId, long datacenterId) {    Assert.isFalse(workerId > maxWorkerId || workerId < 0,            String.fORMat("worker Id can't be greater than %d or less than 0", maxWorkerId));    Assert.isFalse(datacenterId > maxDatacenterId || datacenterId < 0,            String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));    this.workerId = workerId;    this.datacenterId = datacenterId;}
  • 无参构造 开发者没有设置机器号时

  • 有参构造 开发者自行设置机器号

protected static long getDatacenterId(long maxDatacenterId) {    long id = 0L;    try {        //获取本机(或者服务器ip地址)        //DESKTOP-123SDAD/192.168.1.87        InetAddress ip = InetAddress.getLocalHost();        NetworkInterface network = NetworkInterface.getByInetAddress(ip);        //一般不是null会进入else        if (network == null) {            id = 1L;        } else {            //获取物理网卡地址            byte[] mac = network.getHardwareAddress();            if (null != mac) {                id = ((0x000000FF & (long) mac[mac.length - 2]) | (0x0000FF00 & (((long) mac[mac.length - 1]) << 8))) >> 6;                id = id % (maxDatacenterId + 1);            }        }    } catch (Exception e) {        logger.warn(" getDatacenterId: " + e.getMessage());    }    return id;}
protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) {    StringBuilder mpid = new StringBuilder();    mpid.append(datacenterId);    //获取jvm进程信息    String name = ManagementFactory.getRuntimeMXBean().getName();    if (StringUtils.isNotBlank(name)) {                mpid.append(name.split(StringPool.AT)[0]);    }        return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1);}

感谢你能够认真阅读完这篇文章,希望小编分享的“mybatis-plus雪花算法自动生成机器id原理的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: mybatis-plus雪花算法自动生成机器id原理的示例分析

本文链接: https://www.lsjlt.com/news/279203.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mybatis-plus雪花算法自动生成机器id原理的示例分析
    这篇文章主要介绍了mybatis-plus雪花算法自动生成机器id原理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、雪花算法原理  &nbs...
    99+
    2023-06-15
  • mybatis-plus雪花算法自动生成机器id原理及源码
    目录1、雪花算法原理2、自动生成唯一机器号源码1、雪花算法原理         雪花算法使用一个 64...
    99+
    2024-04-02
  • mybatis plus自动生成器的示例分析
    这篇文章将为大家详细讲解有关mybatis plus自动生成器的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。mybatis plus自动生成器解析使用这个可以超快速生成entity s...
    99+
    2023-06-29
  • Mybatis-plus如何提前获取实体类用雪花算法生成的ID
    Mybatis-plus中,通过设置@TableId可以让Mybatis-plus自动为我们生成雪花算法的ID号,该ID号是一个长整型数据,非常方便。但是雪花算法的ID号是在Inse...
    99+
    2024-04-02
  • Mybatis-Plus代码生成器的示例分析
    小编给大家分享一下Mybatis-Plus代码生成器的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 实战 数据库脚本 创建一张商品表test_goodsCREATE&nbs...
    99+
    2024-04-02
  • springboot整合freemarker代码自动生成器的示例分析
    这篇文章给大家分享的是有关springboot整合freemarker代码自动生成器的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。技术架构页面是用 Vue ,element-ui开发;网络请求是 Axi...
    99+
    2023-06-15
  • java编程之AC自动机工作原理的示例分析
    这篇文章将为大家详细讲解有关java编程之AC自动机工作原理的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.应用场景—多模字符串匹配我们现在考虑这样一个问题,在一个文本串text中,我们想找出...
    99+
    2023-05-30
    java
  • Java注解机制之Spring自动装配实现原理的示例分析
    小编给大家分享一下Java注解机制之Spring自动装配实现原理的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! Java中使用注解的情况主要在SpringMVC(Spring Boot等),注解实际上相...
    99+
    2023-05-31
    java spring
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作