SnowFlake雪花算法生成分布式id

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

author :Twitter

/**
 * 雪花算法SnowFlake
 * Created on 2019/3/14.
 *
 * @author Twitter
 */
public class IdSnowFlake {

    public static void main(String[] args) {
        IdSnowFlake flake = new IdSnowFlake();
        System.out.println(flake.nextId());
    }

    /**
     * 起始的时间戳
     */
    private final static long START_STMP = 1480166465631L;

    /**
     * 每一部分占用的位数,序列号占用的位数
     */
    private final static long SEQUENCE_BIT = 12;
    /**
     * 机器标识占用的位数
     */
    private final static long MACHINE_BIT = 5;

    /**
     * 数据中心占用的位数
     */
    private final static long DATACENTER_BIT = 5;

    /**
     * 每一部分的最大值
     */
    private final static long MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT);
    private final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);
    private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT);

    /**
     * 每一部分向左的位移
     */
    private final static long MACHINE_LEFT = SEQUENCE_BIT;
    private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
    private final static long TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT;

    /**
     * 数据中心
     */
    private long datacenterId;
    /**
     * 机器标识
     */
    private long machineId;

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

    /**
     * 上一次时间戳
     */
    private long lastStmp = -1L;

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

    public IdSnowFlake(){

    }

    /**
     * 产生下一个ID
     *
     * @return
     */
    public synchronized long nextId() {
        long currStmp = getNewstmp();
        if (currStmp < lastStmp) {
            throw new RuntimeException("Clock moved backwards.  Refusing to generate id");
        }

        if (currStmp == lastStmp) {
            //相同毫秒内,序列号自增
            sequence = (sequence + 1) & MAX_SEQUENCE;
            //同一毫秒的序列数已经达到最大
            if (sequence == 0L) {
                currStmp = getNextMill();
            }
        } else {
            //不同毫秒内,序列号置为0
            sequence = 0L;
        }

        lastStmp = currStmp;

        // 时间戳部分 + 数据中心部分 + 机器标识部分 + 序列号部分
        return (currStmp - START_STMP) << TIMESTMP_LEFT
                | datacenterId << DATACENTER_LEFT
                | machineId << MACHINE_LEFT
                | sequence;
    }

    private long getNextMill() {
        long mill = getNewstmp();
        while (mill <= lastStmp) {
            mill = getNewstmp();
        }
        return mill;
    }

    private long getNewstmp() {
        return System.currentTimeMillis();
    }
}
分布式Id生成雪花算法SnowFlake 回顾二进制知识以及唯一ID通用的解决方案,重点说明SnowFlake雪花算法原理及实现,以及相关问题解决方案!! 阅读详情

相关推荐

分布式主键ID生成方式-snowflake雪花算法

分布式主键id的几种生成方式

weixin_42142057的博客 1908

雪花算法生成id的Utils(项目中使用)

雪花算法生成id的Utils(项目中使用)

荣山的博客 1782

滤波器初步入门(非常全面)

主要关注的是-3dB这个点,-3dB就是截止频率所对应的点,我们把功率降至50%以下的信号定义为被衰减掉了(但要跟实际情况相结合,有些信号衰减-3db不够,需要衰减更多)-3dB这个点对应我们的电压来说是0.707。设计电路可以留一定的余量,如果你把4k设计为截止频率,那么4k时候衰减倍数为-3dB通常是不够的,你可以将截止频率设为2k,那么4k的衰减就可以达到15dB(假设),根据自己的需要去设计对应的截止频率。理想的滤波器是当输入的信号频率大于截止频率时,大于部分的频率对应的电压信号直接归0。

yybyybds的博客 5653

分布式id生成之雪花id

前言 为什么需要分布式id,因为现在的系统都是集群、分布式的,依赖于数据库的自增id在量大的时候肯定扛不住。网上介绍分布式id的文章很多,现在都是倾向于应用雪花算法生成分布式id,可以一定程度上不依赖redis等中间件。但是看文章的时候发现很多文章有写错的地方,例如:workerId = Netutil.ipv4ToLong(NetUtil.getLocalhoststr());生成的机器id并没有应用,所以我决定写一篇总结性的文章进行答疑。 1.id生成需要注意什么: 特点 说明 全局唯一 不能出现重复的

u010720120的博客 2624

UTILS | 雪花分片ID生成算法snowflake

目录 snowflake算法原理 snowflake算法相比UUID的优势 snowflake算法源码实现 - Java版本 snowflake算法源码实现 - Scala版本 (Twitter官方原版) snowflake算法原理 snowflake算法所生成ID结构: 1位,不用 二进制中最高位为1的都是负数,但是我们生成id一般都使用整数,所以这个...

分享 1907

雪花算法生成长整型ID工具类SnowflakeUtil

JS语言不支持15位以上的长整型,该工具使用与否要有取舍。 public class SnowflakeUtil { /** 开始时间截 (2015-01-01) */ private final static long TWEPOCH = 1420041600000L; /** 工作机器ID(0~31) */ private final static long WORKER_I...

Coffee的博客 4942

雪花算法工具类介绍

雪花 (SnowFlake )算法是一种分布式唯一ID生成算法,可以生成全局唯一的ID标识符,就像自然界中雪花一般没有相同的雪花。它的核心思想是将一个64位的整数分成4部分

7me 3051

分布式ID生成雪花算法SnowFlake

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

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

雪花算法生成数字id_SnowFlake 雪花算法生成分布式 ID 实战

SnowFlake 雪花算法基本概念SnowFlake 雪花算法是 Twitter 开源的分布式唯一 ID 生成算法,其具有简洁、高性能、低延迟、ID 按时间趋势有序等特点。如采用 12 位序列号,则理论支持每毫秒生成 4096 个不同数字,能够满足绝大多数高并发场景下的互联网应用。SnowFlake 雪花算法能保证在 datacenterId 和 workerId 唯一的情况下不会生成重复值。如...

weixin_39842611的博客 385

MySQL分布式环境下生成全局自增有序ID(雪花算法Snowflake)

文章目录1 MySQL全局ID1.1 前言1.2 ID生成要求1.2.1 ID生成规则部分硬性要求1.2.2 ID生成系统可用性要求1.3 一般通用解决方案1.3.1 UUID1.3.1.1 使用1.3.1.2 存在问题1.3.2 数据库自增主键1.3.2.1 单机1.3.2.2 集群分布式集群1.3.3 基于Redis生成全局ID策略1.3.3.1 单机版1.3.3.2 集群分布式1.3.4 雪花算法1.3.4.1 定义1.3.4.2 结构1.3.4.3 实现1.3.4.4 SpringBoot整合雪花

上善若泪 5436

分布式自增ID生成算法 - 雪花算法(SnowFlake)

一、概述 1、SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图: ● 1位,不用。二进制中最高位为1的都是负数,但是我们生成id一般都使用整数,所以这个最高位固定是0 ● 41位,用来记录时间戳(毫秒)。 ○ 41位可以表示$2^{41}-1$个数字, ○ 如果只用来表示正整数(计算机中正数...

浅末年华的博客 5万+

分布式ID生成策略-雪花算法Snowflake

分布式id-snowflake算法解析

初心不忘、始终方得 2507

深入了解Snowflake雪花算法分布式唯一ID生成

分布式系统中,生成唯一ID是一项关键的任务。Snowflake算法是Twitter公司开发的一种分布式唯一ID生成算法,通过对时间、机器ID和序列号的合理组合,保证在分布式环境中生成唯一的64位ID。本文将深入解析Snowflake算法的原理,并附带Java代码示例。Snowflake算法是一种简单而高效的分布式唯一ID生成方案,广泛应用于分布式系统中。通过合理配置机器ID和数据中心ID,以及注意时间回拨问题,我们可以确保Snowflake算法生成ID分布式环境中的唯一性。

Micro麦可乐的博客 3811

如何设计一个分布式ID生成器?(如雪花算法Snowflake

由Sony公司开源,是对雪花算法的变种。它同样是64位,但调整了位数分配:39位时间戳(单位为10毫秒,因此可用年限更长,约174年)、8位序列号、16位机器ID,以及1位预留。其时钟回拨处理策略是直接等待时钟追赶。ULID是一个128位的ID,由48位的时间戳(毫秒精度)和80位的随机数组成。它既能保证按时间排序(字典序),又因为有大量的随机数部分,使其难以被猜测。它对时钟回拨不敏感,因为同一毫秒内生成ID因随机数不同而不同。

破损的天堂鸟博客 818

分布式ID生成算法 - 雪花算法SnowFlake

1. 背景 Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的id,这些id还需要一些大致的顺序(方便客户端排序),并且在分布式系统中不同机器产生的id必须不同。 Twitter的分布式雪花算法 SnowFlake 每秒自增生成26个万个可排序的ID 1、twitter的SnowFlake生成ID能够按照时间有序...

AkiraNicky的博客 1万+

分布式唯一ID生成算法——雪花算法Snowflake

分布式唯一ID生成算法——雪花算法Snowflake)全面详解

专注分享技术、实用优质教程、资源 5033

分布式ID生成方案(二):SnowFlake雪花算法

雪花算法Snowflake) 是twitter公司内部分布式项目采用的ID生成算法,开源后广受国内大厂的好评,在该算法影响下各大公司相继开发出各具特色的分布式生成器。 SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图: Snowflake生成的是Long类型的ID,一个Long类型占8个字节,每个字节占8比特,也就是说一个Long类型占64个比特。 Snowfla...

Dream it Possible 1232

SnowFlake 雪花算法生成分布式 ID

随机生成的起始 ID 可能很大,会很快到达单位毫秒内的最大值,比如 4095(12 位序列号情况下),所以需要对 4095 处理,比如取模、或者和二进制位数&运算 循环使用单位毫秒内的可用数字,避免浪费。总共 64 个 bit 位,对应于 Java 基本数据类型的 Long 类型 1 位符号位,正数是 0,负数是 1,id 一般是正数,因此最高位是 0 41 位时间戳(毫秒级),41 位时间戳不是存储当前时间的时间戳,而是存储时间戳差值(当前时间戳 - 开始时间戳)。

qq_45284986的博客 598

深度思考:雪花算法snowflake分布式id生成原理详解

雪花算法snowflake是一种优秀的分布式ID生成方案,其优点突出:它能生成全局唯一且递增的ID,确保了数据的一致性和准确性;同时,该算法灵活性强,可自定义各部分bit位,满足不同业务场景的需求;此外,雪花算法生成ID的速度快,效率高,能有效应对高并发场景,是分布式系统中不可或缺的组件。

科技互联网领域深度探索者,乐于分享与写作。 5240

人形机器人硬件电路设计入门

人形机器人属于。

blotemj.blog.csdn.net 178

日本村田涡流纺MVS861说明书

日本村田涡流纺MVS861说明书

上一篇: 3步简单 配置MyBatis Generator自动创建代码
下一篇: docker一键安装gitlab简易教程
eddyjoe
博客等级 码龄8年 2粉丝 9原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值