雪花算法 IdWorker Snowflake JAVA实现方案 - 单机版

MyBatis-Plus雪花算法实战:原理、配置与分布式ID生成解决方案 在分布式系统架构中,生成全局唯一标识符(ID)是保障数据一致性与系统可扩展性的基础技术。其核心原理在于设计一种能在多节点环境下避免冲突的生成机制,常见方案包括UUID、数据库序列以及雪花算法等。雪花算法因其结合时间戳、工作机器ID和序列号的位结构设计,在保证全局唯一性的同时,实现了ID的趋势递增,这对数据库索引优化和高并发写入性能具有显著价值。该技术广泛应用于分库分表、微服务链路追踪、高并发业务流水号等场景。本文聚焦于MyBatis-Plus框架对雪花算法的集成实现,深入解析其位结构、默认配置,并针对分布式 阅读详情

 分布式自增长ID生成器,雪花算法JAVA实现

package com.wang.chao.mino.reponse;
import java.lang.management.ManagementFactory;
import java.net.InetAddress;
import java.net.NetworkInterface;

/**
 * <p>名称:IdWorker.java</p>
 * <p>描述:分布式自增长ID</p>
 * <pre>
 *     Twitter的 Snowflake JAVA实现方案
 * </pre>
 * 核心代码为其IdWorker这个类实现,其原理结构如下,我分别用一个0表示一位,用—分割开部分的作用:
 * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000
 * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间,
 * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识),
 * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。
 * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分),
 * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。
 * <p>
 * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加))
 *
 */
public class IdWorker {
    // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动)
    private final static long twepoch = 1288834974657L;
    // 机器标识位数
    private final static long workerIdBits = 5L;
    // 数据中心标识位数
    private final static long datacenterIdBits = 5L;
    // 机器ID最大值
    private final static long maxWorkerId = -1L ^ (-1L << workerIdBits);
    // 数据中心ID最大值
    private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
    // 毫秒内自增位
    private final static long sequenceBits = 12L;
    // 机器ID偏左移12位
    private final static long workerIdShift = sequenceBits;
    // 数据中心ID左移17位
    private final static long datacenterIdShift = sequenceBits + workerIdBits;
    // 时间毫秒左移22位
    private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;

    private final static long sequenceMask = -1L ^ (-1L << sequenceBits);
    /* 上次生产id时间戳 */
    private static long lastTimestamp = -1L;
    // 0,并发控制
    private long sequence = 0L;

    private final long workerId;
    // 数据标识id部分
    private final long datacenterId;

    private static IdWorker idWorker;

    public IdWorker(){
        this.datacenterId = getDatacenterId(maxDatacenterId);
        this.workerId = getMaxWorkerId(datacenterId, maxWorkerId);
    }
    /**
     * @param workerId  *            工作机器ID
     * @param datacenterId  *            序列号
     */
    public IdWorker(long workerId, long datacenterId) {
        if (workerId > maxWorkerId || workerId < 0) {
            throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
        }
        if (datacenterId > maxDatacenterId || datacenterId < 0) {
            throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
        }
        this.workerId = workerId;
        this.datacenterId = datacenterId;
    }

    public static IdWorker getInstance(){
        if(idWorker!=null){
            return idWorker;
        } else {
            synchronized (IdWorker.class){
                if(idWorker == null){
                    idWorker = new IdWorker();
                }
            }
        }
        return idWorker;
    }

    public static long nextId(){
        return getInstance().nextID();
    }
    public static String nextId(String prefix){
        return prefix+getInstance().nextID();
    }
    /**
     * 获取下一个ID
     * @return
     */
    private synchronized long nextID() {
        long timestamp = timeGen();
        if (timestamp < lastTimestamp) {
            throw new RuntimeException(String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
        }

        if (lastTimestamp == timestamp) {
            // 当前毫秒内,则+1
            sequence = (sequence + 1) & sequenceMask;
            if (sequence == 0) {
                // 当前毫秒内计数满了,则等待下一秒
                timestamp = tilNextMillis(lastTimestamp);
            }
        } else {
            sequence = 0L;
        }
        lastTimestamp = timestamp;
        // ID偏移组合生成最终的ID,并返回ID
        long nextId = ((timestamp - twepoch) << timestampLeftShift)
                | (datacenterId << datacenterIdShift)
                | (workerId << workerIdShift) | sequence;

        return nextId;
    }

    private long tilNextMillis(final long lastTimestamp) {
        long timestamp = this.timeGen();
        while (timestamp <= lastTimestamp) {
            timestamp = this.timeGen();
        }
        return timestamp;
    }

    private long timeGen() {
        return System.currentTimeMillis();
    }

    /**
     * <p>
     * 获取 maxWorkerId
     * </p>
     */
    protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) {
        StringBuffer mpid = new StringBuffer();
        mpid.append(datacenterId);
        String name = ManagementFactory.getRuntimeMXBean().getName();
        if (!name.isEmpty()) {
            /*
             * GET jvmPid
             */
            mpid.append(name.split("@")[0]);
        }
        /*
         * MAC + PID 的 hashcode 获取16个低位
         */
        return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1);
    }

    /**
     * <p>
     * 数据标识id部分
     * </p>
     */
    protected static long getDatacenterId(long maxDatacenterId) {
        long id = 0L;
        try {
            InetAddress ip = InetAddress.getLocalHost();
            NetworkInterface network = NetworkInterface.getByInetAddress(ip);
            if (network == null) {
                id = 1L;
            } else {
                byte[] mac = network.getHardwareAddress();
                id = ((0x000000FF & (long) mac[mac.length - 1])
                        | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6;
                id = id % (maxDatacenterId + 1);
            }
        } catch (Exception e) {
            System.out.println(" getDatacenterId: " + e.getMessage());
        }
        return id;
    }
}

分布式ID(2):雪花算法生成ID 这种方案大致来说是一种以划分命名空间(UUID也算,由于比较常见,所以单独分析)来生成ID的一种算法,这种方案把64-bit分别划分成多段,分开来标示机器、时间等,比如在snowflake中的64-bit分别表示如下图(图片来自网络)所示:41-bit的时间可以表示(1L 阅读详情

相关推荐

神经符号AI架构解析:如何通过V&V提升AI系统可信性

在人工智能领域,深度学习模型因其强大的模式识别能力而广泛应用,但其内部决策过程往往如同“黑盒”,难以追溯和解释,这给系统验证与确认带来了巨大挑战。验证与确认是确保复杂软件系统安全、可靠、符合预期的基石,其中验证关注“是否正确地构建了产品”,确认则关注“是否构建了正确的产品”。神经符号人工智能作为一种新兴范式,通过融合符号逻辑的透明推理与深度学习的强大感知,为解决这一难题提供了关键技术路径。它使得AI系统既能从数据中学习复杂模式,又能依据可形式化检验的规则进行逻辑推理,从而在自动驾驶、医疗诊断等高可靠性应用场

weixin_28681379的博客 356

魔改后的雪花算法,生成13位long类型ID,适用于单机版,避免平行越权

魔改后的雪花算法 生成13位long类型ID,适用于单机版,避免平行越权 List item public class IdWorker{ //12位的序列号 private static long sequence; //初始时间戳 private static long twepoch = 1288834974657L; //序列号id长度 private static long sequenceBits = 4L; //序列号最大值

weixin_54071027的博客 1593

LangFuse部署与实践

LangFuse的原理主要是基于可观察性和分析技术来监控和优化低延迟消息(LLM)应用。它提供了一套完整的解决方案,通过收集、处理和分析LLM应用在运行过程中产生的各种数据,来生成实时的、深入的、可操作的见解。通过提供实时的、深入的见解和可视化的跟踪功能,LangFuse使得识别和解决应用性能问题变得更加简单和高效。总的来说,LangFuse的原理是通过综合运用可观察性和分析技术,来提供对LLM应用的全面监控和优化能力。这使得开发者和运维团队能够更加高效地管理和维护他们的应用,从而提升用户体验和业务效益。

pumpkin84514的博客 7936

Java分布式自增长ID实现方案

package cc.zeelan.framework; import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.NetworkInterface; /** * <p>名称:IdWorker.java</p> * &lt...

weixin_34393428的博客 1615

15、基于最优传输的协作多视图聚类框架

本文提出了一种基于最优传输理论的协作多视图聚类框架,通过引入协作学习机制在不同视图间建立先验交互,以提升共识聚类的质量。框架包含两种新方法:协作共识投影方法(CoCP)和基于新表示的协作共识方法(CoCNR)。CoCP在全局空间中整合多视图信息并进行共识投影,而CoCNR则通过协作编码生成新的数据表示以实现更优聚类。方法利用熵正则化的Wasserstein距离与Wasserstein重心,有效捕捉数据分布间的几何结构,并通过聚合步骤获得统一模型。实验结果表明,所提方法在多个数据集上均优于现有方法,具有良好的

gpt4scribbler的博客 85

android osmdroid 加载常用离线地图格式(开源的在线地图)

osmdroid是(几乎)完整/免费更换为Android MapView(v1 API)类。它还包括一个模块化的瓷砖供应商系统支持众多的在线和离线瓷砖来源和覆盖支持内置覆盖绘制图标,跟踪位置和形状。如果想在你项目中使用osmdroid,绝对是灵活度最高,不用申请百度,高德等的key。还有一堆规则要遵循。osmdroid可以支持多图层叠加,绘制自已的图层。离线加载常用地图格式zip,sqlite,.

mmsx990的博客 1万+

分布式ID生成之雪花算法(SnowFlake)

一、分布式ID 1、分布式ID的特点: 全局唯一性:不能出现有重复的ID标识,这是基本要求。 递增性:确保生成ID对于用户或业务是递增的。 高可用性:确保任何时候都能生成正确的ID。 高性能性:在高并发的环境下依然表现良好。 2、分布式ID生成方案: 在分布式系统中生成唯一ID的方案有很多,常见的方式大概有以下三种: 依赖数据库,使用如MySQL自增列或Oracle序列等。 UUID随机数 snowflake雪花算法 3、几种方案优缺点: UUID:Java自带的生成一串唯一随机36位字符串,可以保

一个喜欢诗和远方的程序媛 2908

2020年大连理工大学《单片机原理及应用》期末试卷

2020年大连理工大学《单片机原理及应用》期末试卷 此试卷为大连理工大学2020年《单片机原理及应用》期末试卷; 大连理工大学2020年《单片机原理及应用》期末试卷; 大连理工大学2020年《单片机原理及应用》期末试卷。 ...

无名何许人的博客 1478

java生成主键id,java自定义主键生成器

1. 实体类代码@Entity@Data@Table(name = "user")public class User implements Serializable {@Id@GenericGenerator(name = "customerGenerator", strategy = "CustomerGeneratorClass", parameters = {@org.hibernate.a...

weixin_42531163的博客 1594

黑猫带你学UFS协议第13篇:UFS初始化详解(Boot Operation)

本文详细解析了UFS设备的初始化过程,包括部分初始化、加载启动代码(可选)和初始化完成三个阶段。重点介绍了如何通过设备描述符和逻辑单元描述符配置引导特性,以及如何从UFS设备加载启动代码。内容适用于嵌入式硬件和存储领域的开发者。

黑猫奥利奥的博客 3555

华为MetaERP Oracle EBS OM(订单管理)模块详解作为ERP财务解决方案架构师,理解OM模块的业务全景和数据模型至关重要。OM是EBS分销链路的核心引擎,贯穿“订单到收款“(Orde

Oracle EBS OM模块是管理销售订单全生命周期的核心模块,涵盖客户管理、订单执行、发运开票、定价及信用控制等功能。其标准流程包括订单录入、预订、发放、发运确认和自动开票等环节,核心数据表涉及订单、客户、发运和定价等业务对象。OM模块与库存、应收、发运等模块深度集成,架构师需重点设计订单类型、信用控制策略和自动开票接口等关键环节,确保业务流程高效流转。

金牌架构师 358

Java实现雪花算法(snowflake)-生成永不重复的ID(源代码

小编利用空余时间整理了一份《MySQL性能调优手册》,初衷也很简单,就是希望能够帮助到大家,减轻大家的负担和节省时间。关于这个,给大家看一份学习大纲(PDF)文件,每一个分支里面会有详细的介绍。这里都是以图片形式展示介绍,如要下载原文件以及更多的性能调优笔记(MySQL+Tomcat+JVM)!一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

2401_84166836的博客 2450

YOLOv8 智能交通违章检测 - 机动车道占用(违停/非机动车占道)详解

本文提出基于YOLOv8的智能交通违章检测方案,主要针对机动车道占用问题。系统整合目标检测、目标跟踪和ROI区域判定,实现两种典型场景检测:违章停车(静止超时)和非机动车/行人占道。详细介绍了系统架构、配置文件设计、核心逻辑实现及可视化模块,包括ROI区域管理、状态跟踪和违章判定算法。针对实际应用中的堵车误判、非机动车误报等问题,提出了密度检测、轨迹分析和自适应阈值等优化策略。该方案计算量适中,适合边缘设备部署,并建议配套开发ROI标定工具和证据链保存功能。

u010117029的博客 235

雪花算法(IdWorker.java)

package utils; import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.NetworkInterface; /** * <p>名称:IdWorker.java</p> * <p>描述:分布式自增长ID</p...

weixin_45061662的博客 868

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

雪花算法IdWorker

package util; import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.NetworkInterface; /** 名称:IdWorker.java 描述:分布式自增长ID Twitter的 Snowflake JAVA实现方案 核...

weixin_44118941的博客 758

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SnowFlake 雪花算法详解与实现 & MP中的应用

BackGround 现在的服务基本是分布式,微服务形式的,而且大数据量也导致分库分表的产生,对于水平分表就需要保证表中 id 的全局唯一性。 对于 MySQL 而言,一个表中的主键 id 一般使用自增的方式,但是如果进行水平分表之后,多个表中会生成重复的 id 值。那么如何保证水平分表后的多张表中的 id 是全局唯一性的呢? 如果还是借助数据库主键自增的形式,那么可以让不同表初始化一个不同的初...

橘嘉禾 293

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java实现雪花算法(snowflake)-生成永不重复的ID(源代码+工具类)使用案例

雪花算法是由Twitter公司开源的snowflake(雪花)算法。 1、雪花算法的原理 雪花算法会生成一个64位的二进制数据,为一个Long型。 (转换成字符串后长度最多19),其基本结构: 第一位:为未使用 第二部分:41位为毫秒级时间(41位的长度可以使用69年) 第三部分:5位datacenterld和5位workerld(10位的长度最多支持部署1024个节点) 第四部分:最后12位是毫秒内的计数(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号) snowflake生成的ID整体上按

程序员猫爪 6755

idworker java 使得_IdWorker java 雪花算法 kaki的博客

packagecom.icbc.utils;importjava.lang.management.ManagementFactory;importjava.net.InetAddress;importjava.net.NetworkInterface;/****名称:IdWorker.java*描述:分布式自增长ID,雪花算法** Twitter的SnowflakeJAVA实现方案**核心...

weixin_39605647的博客 218

Snowflake(雪花算法)- 分布式自增长ID - JAVA实现

import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.NetworkInterface; /** * <p>名称:IdWorker.java</p> * <p>描述:分布式自增长ID</p> * <pre&...

qq_42806915的博客 336

java中雪花算法怎么使用

雪花算法(Snowflake Algorithm)是一种生成分布式唯一ID的算法。它是由Twitter开发的。 在Java中使用雪花算法需要使用第三方库,比如Twitter的snowflake和Hutool的IdWorker。 下面是使用Twitter的snowflake库的示例代码: import com.twitter.snowflake.Snowflake; import com.twitt...

weixin_35749440的博客 436

分布式自增长ID-IdWorker(雪花算法生成随机id)

package util; import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.NetworkInterface; /** 名称:IdWorker.java 描述:分布式自增长ID Twitter的 Snowflake JAVA实现方案 核...

as_you_like_zx的博客 601

场景问题——雪花算法生成的id在前端使用时末尾几位数都成了0是什么原因

首先说明原因。如下图,,而雪花算法生成的id位数则是19位的,所以当前端使用number类型去接收后端生成的19位id时,末尾三位数字不管是什么,都会变成0。解决方法也很简单,就是用可以容纳19位数的类型去接收和使用,比如字符串,本人在后端使用雪花算法生成的id也是字符串类型,主键非空唯一即可,需求千千万,奇葩也很多,若是真有需要非数字的id,字符串也是可以满足的,而且字符串的方法和工具类不比integer少,使用起来反而更加高效。

qq_41905890的博客 885

IdWorker雪花算法

package util; import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.NetworkInterface; /**  * &lt;p&gt;名称:IdWorker.java&lt;/p&gt;  * &lt;p&gt;描述:分布式自增长ID&lt;/p&g...

qq_42886494的博客 1152

1雪花算法

文章目录分布式ID生成器IdWorker 分布式ID生成器 目前微服务架构盛行,在分布式系统中的操作中都会有一些全局性ID的需求,所以我们不能使用数据库本身的自增 功能来产生主键值,只能由程序来生成唯一的主键值。我们采用的是开源的twitter( 非官方中文惯称:推特.是国外 的一个网站,是一个社交网络及微博客服务) 的snowflake (雪花)算法。 IdWorker package co...

Insist___的博客 231

分布式id的生成方式——雪花算法

雪花算法是twitter开源的一个算法。 由64位0或1组成,其中41位是时间戳,10位工作机器id,12位序列号,该类通过方法nextID()实现id的生成,用Long数据类型去存储。 我们使用idworker不建议每次都通过new的方式使用,如果在Spring中,可以通过如下方式将该bean注入到Spring容器中 <bean id="idWorker" cl...

weixin_30512785的博客 232

snowflake做主键 自增_简单实用算法—分布式自增ID算法snowflake(雪花算法)

算法概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移到Cassandra,因为Cassandra没有顺序I...

weixin_31617975的博客 254
上一篇: springboot yml 注入列表(字符串、对象)
下一篇: SpringBoot 使用自定义注解(基于AOP) 实现操作日志管理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

仰望星空@脚踏实地

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

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

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

打赏作者

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

抵扣说明:

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

余额充值