Java收集的雪花算法代码详解

Java收集的雪花算法代码详解

什么是雪花算法?

雪花算法是一种能够帮助我们生成唯一ID的算法,由Twitter公司开发并在2010年开源。该算法的特点是高并发下不重复,适合在分布式系统中作为唯一ID的生成器。使用雪花算法可以有效减少分布式系统中因ID冲突造成的问题。

雪花算法的实现方式

雪花算法的实现方式如下:

  1. 首先,雪花算法规定了一个64位的二进制数,

  2. 将其分成如下几个部分:

    • 第一个部分为1位,固定为0,表示正数。

    • 第二个部分是41位的时间戳,表示生成ID的时间,精确到毫秒级别,可以使用System.currentTimeMillis()方法来获取。

    • 第三个部分是10位的机器标识符,可以通过机器的MAC地址或者其它唯一标识来获取,来保证每台机器拥有不同的标识符。

    • 第四个部分是12位的序列号,表示同一毫秒内生成的ID序号,可以使用AtomicLong类型的计数器来保证并发下的唯一性。

  3. 将这四个部分按照顺序拼装成64位的二进制数,最后转换成10进制即可生成唯一ID。

Java实现示例

下面是Java语言实现的雪花算法示例代码:

public class SnowFlake {

    //开始时间戳(2019-10-01)
    private static final long START_STMP = 1569888000000L;

    //机器标识位数
    private static final long MACHINE_BIT = 10L;

    //序列号位数
    private static final long SEQUENCE_BIT = 12L;

    //时间戳移位数
    private static final long TIMESTMP_LEFT_BIT = MACHINE_BIT + SEQUENCE_BIT;

    //机器标识最大值
    private static final long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);

    //机器标识
    private long machineId;

    //序列号
    private long sequence = 0L;

    //上次生成ID的时间戳
    private long lastStmp = -1L;

    public SnowFlake(long machineId) {
        if(machineId > MAX_MACHINE_NUM || machineId < 0) {
            throw new IllegalArgumentException("machineId can't be greater than " + MAX_MACHINE_NUM + " or less than 0");
        }
        this.machineId = machineId;
    }

    public synchronized long nextId() {
        long currStmp = System.currentTimeMillis();
        if(currStmp < lastStmp) {
            throw new RuntimeException("Clock moved backwards.  Refusing to generate id");
        }
        if(currStmp == lastStmp) {
            sequence = (sequence + 1) & ((1 << SEQUENCE_BIT) - 1);
            if(sequence == 0) {
                currStmp = tillNextMillis(lastStmp);
            }
        }else {
            sequence = 0L;
        }
        lastStmp = currStmp;
        return ((currStmp - START_STMP) << TIMESTMP_LEFT_BIT) | (machineId << SEQUENCE_BIT) | sequence;
    }

    private long tillNextMillis(long lastStmp) {
        long currStmp = System.currentTimeMillis();
        while(currStmp <= lastStmp) {
            currStmp = System.currentTimeMillis();
        }
        return currStmp;
    }
}

使用该代码可以非常轻松地生成分布式系统中的唯一ID,例如:

public class TestSnowFlake {

    public static void main(String[] args) {
        SnowFlake snowFlake = new SnowFlake(1L);
        for(int i = 0; i < 10; i++) {
            System.out.println(snowFlake.nextId());
        }
    }
}

执行以上Java代码后,将会在控制台输出10个唯一ID。

总结

通过学习本文,我们了解了雪花算法在分布式系统中的应用,以及Java语言实现的雪花算法代码。这些知识不仅能够提高我们的编程能力,而且将会在分布式系统开发中带来很大的便利。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java收集的雪花算法代码详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Springboot自定义mybatis拦截器实现扩展

    下面是详细讲解“Springboot自定义mybatis拦截器实现扩展”的完整攻略。 什么是Mybatis拦截器 Mybatis拦截器是一种拦截器模式的机制,通过动态代理技术拦截方法的调用,在方法执行前后进行拦截处理。拦截器可以拦截Mybatis数据库访问层的所有操作,如SQL解析、SQL执行、结果集处理等。通过Mybatis拦截器机制,我们可以在方法调用前…

    Java 2023年5月20日
    00
  • java中ssj框架的项目搭建流程

    下面就是Java中SSJ框架项目搭建流程的完整攻略: 1. 准备工作 安装Java开发工具包(JDK) 安装集成开发环境(IDE)如IntelliJ IDEA或Eclipse 安装Maven构建工具 2. 新建Maven项目 使用IDE创建新的Maven项目,需要指定Maven坐标,其中包含了项目的各个基本属性,如groupId,artifactId,ver…

    Java 2023年5月20日
    00
  • indexedDB bootstrap angularjs之 MVC DOMO (应用示例)

    “indexedDB bootstrap angularjs之 MVC DOMO (应用示例)”指的是使用indexedDB、bootstrap和angularjs构建MVC模式的web应用程序的示例。以下是详细的攻略: 1. 环境准备 安装Node.js和npm; 安装bower:npm install -g bower; 创建一个新的文件夹,并通过终端进…

    Java 2023年6月15日
    00
  • Java 锁的知识总结及实例代码

    Java 锁的知识总结及实例代码 在 Java 中,锁机制是一个非常重要的多线程编程的知识点。下面对 Java 锁相关的知识进行总结,并提供两个示例代码说明锁机制的应用。 概念 互斥锁(mutex):用于控制对共享资源的访问。对于任一个时刻,只有一个线程可以访问共享资源,其他的线程必须等待。 读写锁(ReadWriteLock):允许多个线程同时读共享资源,…

    Java 2023年5月23日
    00
  • Java 操作Properties配置文件详解

    Java操作Properties配置文件详解 在Java开发中,Properties是一种经常使用的配置文件格式。Properties文件是一种键值对的格式,它通常用来存储应用程序的配置信息,比如数据库的连接信息、系统参数等等。 Properties的基本格式 Properties文件通常是一个以.properties为后缀的文本文件,其中每一行都是一个键值…

    Java 2023年5月20日
    00
  • java实现对服务器的自动巡检邮件通知

    下面是“Java实现对服务器的自动巡检邮件通知”的攻略,具体步骤如下: 1. 安装JavaMail API JavaMail API 是Java语言编写的邮件发送和接收的一个API,它支持SMTP、POP3和IMAP协议等,我们需要先下载并安装它。 可以到Oracle官网下载JavaMail API:https://www.oracle.com/java/t…

    Java 2023年6月15日
    00
  • SpringBoot+SpringSecurity+jwt实现验证

    下面我会提供一个基于Spring Boot、Spring Security 和 JSON Web Token(JWT)的认证示例。 一、什么是JWT JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种简单的、自包含的方式,用于在通过网络进行传输的两个实体之间安全传递信息。它被称为自包含是因为JWT包含了所有身份验证(Aut…

    Java 2023年5月20日
    00
  • 使用Spring Security OAuth2实现单点登录

    使用Spring Security OAuth2实现单点登录的完整攻略如下: 1. 概述 OAuth(Open Authorization)是一个标准的身份验证和授权协议,OAuth2是OAuth协议的下一个版本。OAuth2基于授权访问所有类型的应用程序,通过集中授权服务器授权用户访问受保护的资源。在实际应用中,OAuth2通常用来实现单点登录(SSO)的…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部