Twitter的Snowflake算法生成唯一订单号配置类

基于Nacos动态感知的Snowflake Worker ID分配实战 本文深入探讨了在微服务动态扩缩容场景下,如何利用Nacos的服务注册与发现机制实现Snowflake算法Worker ID的自动分配。该方案通过监听Nacos服务实例列表变化,并依据IP与端口排序计算唯一索引,动态生成Worker ID与Datacenter ID,有效解决了传统静态配置或依赖外部存储方案在弹性伸缩时的ID冲突与运维难题,是一种轻量级、云原生的优雅实践。 阅读详情
package com.ten.utils;

/**
 * @author ChenYanbing
 * @title: UniqueOrderGenerate
 * @projectName tencent-demo
 * @description: TODO
 * @date 2019/8/19:39
 */


/**
 * Twitter_Snowflake<br>
 * SnowFlake的结构如下(每部分用-分开):<br>
 * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 <br>
 * 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0<br>
 * 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截)
 * 得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69<br>
 * 10位的数据机器位,可以部署在1024个节点,包括5位datacenterId和5位workerId<br>
 * 12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号<br>
 * 加起来刚好64位,为一个Long型。<br>
 * SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。
 */
public class UniqueOrderGenerate {
// ==============================Fields===========================================
    /** 开始时间截 (2019-08-01) */

    private final long twepoch = 1564625329000L;

    /** 机器id所占的位数 */
    private final long workerIdBits = 5L;

    /** 数据标识id所占的位数 */
    private final long datacenterIdBits = 5L;

    /** 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) */
    private final long maxWorkerId = -1L ^ (-1L << workerIdBits);

    /** 支持的最大数据标识id,结果是31 */
    private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);

    /** 序列在id中占的位数 */
    private final long sequenceBits = 12L;

    /** 机器ID向左移12位 */
    private final long workerIdShift = sequenceBits;

    /** 数据标识id向左移17位(12+5) */
    private final long datacenterIdShift = sequenceBits + workerIdBits;

    /** 时间截向左移22位(5+5+12) */
    private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;

    /** 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095) */
    private final long sequenceMask = -1L ^ (-1L << sequenceBits);

    /** 工作机器ID(0~31) */
    private long workerId;

    /** 数据中心ID(0~31) */
    private long datacenterId;

    /** 毫秒内序列(0~4095) */
    private long sequence = 0L;

    /** 上次生成ID的时间截 */
    private long lastTimestamp = -1L;

    //==============================Constructors=====================================
    /**
     * 构造函数
     * @param workerId 工作ID (0~31)
     * @param datacenterId 数据中心ID (0~31)
     */
    public UniqueOrderGenerate(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;
    }

    // ==============================Methods==========================================
    /**
     * 获得下一个ID (该方法是线程安全的)
     * @return SnowflakeId
     */
    public synchronized long nextId() {
        long timestamp = timeGen();

        //如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常
        if (timestamp < lastTimestamp) {
            throw new RuntimeException(
                    String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
        }

        //如果是同一时间生成的,则进行毫秒内序列
        if (lastTimestamp == timestamp) {
            sequence = (sequence + 1) & sequenceMask;
            //毫秒内序列溢出
            if (sequence == 0) {
                //阻塞到下一个毫秒,获得新的时间戳
                timestamp = tilNextMillis(lastTimestamp);
            }
        }
        //时间戳改变,毫秒内序列重置
        else {
            sequence = 0L;
        }

        //上次生成ID的时间截
        lastTimestamp = timestamp;

        //移位并通过或运算拼到一起组成64位的ID
        return (((timestamp - twepoch) << timestampLeftShift) //
                | (datacenterId << datacenterIdShift) //
                | (workerId << workerIdShift) //
                | sequence);
    }

    /**
     * 阻塞到下一个毫秒,直到获得新的时间戳
     * @param lastTimestamp 上次生成ID的时间截
     * @return 当前时间戳
     */
    protected long tilNextMillis(long lastTimestamp) {
        long timestamp = timeGen();
        while (timestamp <= lastTimestamp) {
            timestamp = timeGen();
        }
        return timestamp;
    }

    /**
     * 返回以毫秒为单位的当前时间
     * @return 当前时间(毫秒)
     */
    protected long timeGen() {
        return System.currentTimeMillis();
    }

    //==============================Test=============================================
    /** 测试 */
    public static void main(String[] args) {
        UniqueOrderGenerate idWorker = new UniqueOrderGenerate(0, 0);
        for (int i = 0; i < 10; i++) {
            long id = idWorker.nextId();
            //System.out.println(Long.toBinaryString(id));
            System.out.println(id);
        }
    }
}

Controller层调用测试

package com.ten.controller;

import com.ten.utils.RecordNoUtils;
import com.ten.utils.SMSUtil;
import com.ten.utils.UniqueOrderGenerate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * Created by ChenYanbing on 2019/7/29.
 */
@Controller
@RequestMapping("test")
public class TestController {

    /**
     * 生成订单号生成12位
     * @return
     */
    @RequestMapping("/order")
    @ResponseBody
    public long uuid(){
        //这里的0,0分别是      * @param workerId 工作ID (0~31)     * @param datacenterId 数据中心ID (0~31),可以写在配置文件中。
        UniqueOrderGenerate idWorker = new UniqueOrderGenerate(0, 0);
        return  idWorker.nextId();
    }
}

 

订单号生成规则的思考,twitter snowflake算法 snowflake算法 snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。       该算法实现基本就是二进制操作,... 阅读详情

相关推荐

雪花算法 Snowflake 生成分布式自增 ID 详解

文章目录1、雪花算法概述2、雪花算法结构3、雪花算法生成的 ID 性质4、雪花算法的优点5、雪花算法的缺点 1、雪花算法概述 Snowflake 是 twitter 开发的全局唯一 ID 生成服务。 Twitter 的分布式雪花算法 Snowflake,经测试 Snowflake 每秒能够产生 26 万个自增可排序的ID twitter 的 Snowflake 生 成ID能够按照时间有序生成 Snowflake 算法生成 id 的结果是一 个 64bit 大小的整数, 为一个 Long 型(转换成字符串后

cjh的博客 6941

Twitter的分布式自增ID算法snowflake

结构 snowflake的结构如下(每部分用-分开): 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 第一位为未使用,接下来的41位为毫秒级时间(41位的长度可以使用69年),然后是5位datacenterId和5位workerId(10位的长度最多支持部署1024

公子的专栏 4259

Java 雪花算法生成器及其原理解析

package com.dongbawen.hppa.support.utils; /** * Twitter_Snowflake<br> * SnowFlake的结构如下(每部分用-分开):<br> * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 00000000000...

诺浅的专栏 1691

雪花算法 SnowflakeIdWorker

雪花算法

mengtianqq的博客 544

忘掉 Snowflake,感受一下性能高出 587 倍的全局唯一 ID 生成算法

今天我们来拆解 Snowflake 算法,同时领略百度、美团、腾讯等大厂在全局唯一 ID 服务方面做的设计,接着根据具体需求设计一款全新的全局唯一 ID 生成算法。这还不够,我们会讨论到全局唯一 ID 服务的分布式 CAP 选择与性能瓶颈。 已经熟悉 Snowflake 的朋友可以先去看大厂的设计和权衡。 百度 UIDGenertor:https://github.com/baidu/uid-... 美团 Leaf:https://tech.meituan.com/2017... 腾讯 Seqsvr

JineD的博客 9871

twitterlogin:Twitter的登录

该项目是通过引导的。 可用脚本 在项目目录中,可以运行: npm start 在开发模式下运行应用程序。 打开在浏览器中查看它。 如果您进行编辑,则页面将重新加载。 您还将在控制台中看到任何棉绒错误。 npm test 在交互式监视模式下启动测试运行器。 有关更多信息,请参见关于的部分。 npm run build 构建生产到应用程序build文件夹。 它在生产模式下正确捆绑了React,并优化了构建以获得最佳性能。 生成被最小化,并且文件名包括哈希值。 您的应用已准备好进行部署! 有关更多信息,请参见关于的部分。 npm run eject 注意:这是单向操作。 eject ,您将无法返回! 如果您对构建工具和配置选择不满意,则可以随时eject 。 此命令将从您的项目中删除单个生成依赖项。 相反,它将所有配置文件和传递依赖项(webpack,Babel,ESLint等

订单号的生成

一.订单号生成的原则: 1.全局的唯一性 2.自增长 3.长度的要求 4.具有一定的可读性 5.保密,不可推测性 6.效率性 二.实现方案 常见的ID生成策略。 1. 数据库自增长序列或字段 2. UUID 3. UUID的变种*【UUID to Int64;NHibernate在其主键生成方式中提供了Comb算法(combined guid/timestamp)】 4. Redi...

一一哥 1万+

Android:Google三方库之Adjust集成详细步骤

Android为APP添加google adjust功能

学习就是我的个性 4473

高并发下生成订单号的策略

本文介绍了分布式系统中生成唯一订单号的多种方案,包括数据库自增ID、时间戳+随机数、时间戳+会员ID、GUID/UUID等方法,并分析了各自的优缺点。重点讲解了Twitter的SnowFlake算法,该算法通过组合时间戳、机器ID和序列号生成18位唯一ID,支持高并发场景,单机每秒可生成300万+ID。文章详细解析了SnowFlake的64位二进制结构,并提供了完整的Java实现代码和测试用例,验证了其在单线程和多线程环境下都能保证ID唯一性。该算法适用于需要高效生成全局唯一ID的分布式系统场景。

前G厂程序员/架构/产研经理,AI 进化派,一线 OPC 实践者。 持续分享编程、职场、AI、副业/创业干货~ 4万+

DrMOS电路仿真

将驱动电路与功率MOS集成化后既是DrMOS。把驱动芯片以及上下桥MOSFET封装在一起,这样每一相供电就有了单独的驱动芯片,并且这种高度整合的MOSFET可以通过更高的电流、发热比传统的MOSFET也小很多且更节能 自举升压同步BUCK高低侧栅驱动电路原理及仿真 ...

Srambler的博客 5037

【车辆动力学】专栏目录汇总

车辆动力学知识目录汇总

CrazyRabbit的博客 1713

高并发环境下生成订单唯一流水号方法:SnowFlake

关于订单号的生成,一些比较简单的方案: 1、数据库自增长ID 优势:无需编码缺陷: 大表不能做水平分表,否则插入删除时容易出现问题高并发下插入数据需要加入事务机制在业务操作父、子表(关联表)插入时,先要插入父表,再插入子表 2、时间戳+随机数 优势:编码简单缺陷:随机数存在重复问题,即使在相同的时间戳下。每次插入数据库前需要校验下是否已经存在相同的数值。 3

fayeyiwang的专栏 2万+

【100%通过率】华为OD机试真题 Python 实现【最多组合直角三角形个数】【2023 Q1 | 100分】

有N条线段,长度分别为a[1]-a[n]。 现要求你计算这N条线段最多可以组合成几个直角三角形。 每条线段只能使用一次,每个三角形包含三条线段。

MISAYAONE的博客 1万+

【分布式系统】唯一ID生成策略总结

文章目录全局唯一id介绍    全局唯一id特点:常见全局唯一id生成策略    1、数据库自增长序列或字段生成id 全局唯一id介绍     系统唯一id是我们在设计阶段常常遇到的问题。在复杂的分布式系统中,几乎都需要对大量的数据和消息进行唯一标识。在设计初期,我们需要考虑日后数据量的级别,如果可能会对数据进行分库分表,那么就需要有一个全局唯一id来标识一条数据或记录。生成唯一id的策略有多种,但是每种策略都有它的适用场景、优点以及局限性。

梦蝶 6645

基于YOLOv11的无人机目标检测系统:实现drone、bird、aircraft多类别识别

采用改进的YOLOv11网络结构,平衡检测精度和速度融合VisDrone和UAVDT数据集,增强模型泛化能力设计多尺度特征融合模块,提升小目标检测性能开发直观的UI界面,便于实际部署和应用。

YOLO 322

Unity 之如何使用Pico4u锚点功能实现一个世界锁GameRoot

摘要 空间锚点技术是混合现实(MR)应用的核心,能永久记录虚拟物体的空间位置。文章介绍了在Unity中使用Pico SDK实现空间锚点的完整流程:1)环境配置需安装XR模块和Pico SDK;2)关键操作包括启动空间感知、创建/删除/查询/更新锚点;3)提供了经典应用案例,通过GameRoot节点实现场景固定和锚点同步。源码展示了基于XR交互工具包的锚点抓取与位置更新实现,为MR开发提供了实用参考方案。

TxNet 971

生成唯一订单号

@description 订单号生产工具类 package com.quhai.service.utils; /** * @description 订单号生产工具类 * @author 李鹏 * @date 2019-11-05 * Twitter_Snowflake<br> * SnowFlake的结构如下(每部分用-分开):<br> * 0 - 00000...

weixin_44310899的博客 360

【11】科曼医疗——科曼医疗 嵌入式--面试,校招,面试问答记录

科曼医疗嵌入式校招面试记录:3位面试官分别考察应用层技术、底层技术和HR面。技术问题涵盖C++特性(多态、虚函数、指针与引用区别)、内存管理(malloc与new对比)、嵌入式基础(51最小系统、IIC/SPI协议)及项目经验(智能黑板擦专利项目)。同时考察了Linux使用经验、STM32开发及嵌入式操作系统认知。最后环节应聘者询问了开发环境及面试流程。面试内容全面覆盖嵌入式开发核心知识点。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1248

推荐开源项目:SnowFlake —— Twitter的分布式唯一ID生成器

推荐开源项目:SnowFlake —— Twitter的分布式唯一ID生成器 在大数据时代,我们常常需要为每条记录生成一个全局唯一的标识符(ID)。Twitter开源的SnowFlake算法,就是为了解决这个问题而设计的一个高效、有序的ID生成方案。现在,这个算法已经被Java语言成功实现,让我们一起深入了解并尝试使用它吧! 项目介绍 SnowFlake是Twitter提出的一种基于时间戳的分布式...

gitblog_00074的博客 671

手把手教你学Simulink--基于Simulink的高速公路自动驾驶场景仿真建模

特点车道保持:自动调整车辆方向以保持在车道中央。自适应巡航控制(ACC):根据前方车辆的速度自动调节车速。换道辅助:安全地变换车道以超过慢速行驶的车辆或准备驶离高速公路。紧急制动:检测潜在碰撞并采取措施避免事故。挑战安全性:确保所有功能在各种条件下都能可靠运行。实时性:处理大量传感器数据,并迅速做出反应。复杂性:集成多个子系统,包括感知、规划与控制。首先明确要模拟的任务内容。车辆需保持在车道内行驶。根据交通情况自动调整速度。安全地执行换道操作。在必要时实施紧急制动。

MHD0815的博客 246

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

分布式环境,生成全局唯一的订单号

在探究订单号唯一的过程中,我们不得不先了解Twitter SnowFlake(雪花算法),github上可查看器源码,下载地址https://github.com/twitter/snowflake,源码使用Scala进行编写。接下来我们先来了解一下SnowFlake。 SnowFlake 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是U...

码农博士的博客 1525

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

java生成订单唯一编号_java唯一订单号生成

importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;publicclassIdWorker{protectedstaticfinalLoggerLOG=LoggerFactory.getLogger(IdWorker.class);/***每个节点的唯一数字ID*/privatelongworkerId;privat...

weixin_35322457的博客 3814

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

全局唯一订单号生成方法(参考snowflake)

全局唯一订单号生成方法(参考snowflake)Snowflake is a network service for generating unique ID numbers at high scale with some simple guarantees.简介对于一个较大的订购业务场景,我们往往需要能够生成一个全局的唯一的订单号,如何在多个集群,多个节点高效生成唯一订单号?我们参考了Twitte

Light_shine的专栏 2万+

SnowFlake算法Java实现(雪花算法)生成分布式ID

SnowFlake算法(雪花算法)java 生成分布式ID。SnowFlake 算法是 Twitter 开源的分布式唯一 ID 生成算法。雪花算法其具有高性能、低延迟、按时间趋势有序等特点。雪花算法理论支持每毫秒生成 4096 个不同数字,能够满足绝大多数高并发场景下的互联网应用。

鸟哥哥的专栏 4834

java使用雪花算法生成不重复随机数(订单号)

项目中数据库会生成不重复随机数主键ID,但是不适合生成订单号。因此要自己写随机订单号。考虑采用雪花算法。 先写一个生成订单的工具类,然后再写一个调用工具类调用先前工具类生成ID的方法。 package com.rdd; /** * Twitter_Snowflake<br> * SnowFlake的结构如下(每部分用-分开):<br> * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000.

此人很懒,什么也没有留下~ 3335
上一篇: Tomcat能够稳定支持的最大用户并发量
下一篇: MyBatis新增数据直接返回主键ID
听风动
博客等级 码龄8年 63粉丝 90原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

听风动

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

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

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

打赏作者

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

抵扣说明:

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

余额充值