首页 > 其他分享 >技术汇总:第六章:分布式自增长ID

技术汇总:第六章:分布式自增长ID

时间:2023-01-29 19:44:59浏览次数:59  
标签:java 0000000000 private static long 第六章 ID 分布式

package util;

import java.lang.management.ManagementFactory;
import java.net.InetAddress;
import java.net.NetworkInterface;

/**

  • 名称:IdWorker.java

  • 描述:分布式自增长ID

  • 
    
  • Twitter的 Snowflake JAVA实现方案
    
    • 1
  • 核心代码为其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左右,完全满足需要。
  •  

  • 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加))
  • @author Polim
    */
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;

    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;
    }
    /**
     * 获取下一个ID
     *
     * @return
     */
    public 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));
        }

 

更多内容请见原文,原文转载自:https://blog.csdn.net/weixin_44519496/article/details/120575440

 

标签:java,0000000000,private,static,long,第六章,ID,分布式
From: https://www.cnblogs.com/wangchuanxinshi/p/17073690.html

相关文章

  • macos安装android studio(Android Studio 2021.1.1)
    一,官网下载https://developer.android.google.cn/studio/如图:点击DownloadAndroidStudio此处选择自己电脑的芯片点击后开始下载说明:刘宏缔的架构森林是一......
  • 前端生产id,uuid
    exportconstuuid=()=>{consttemp_url=URL.createObjectURL(newBlob())constuuid=temp_url.toString()URL.revokeObjectURL(temp_url)//释放这个ur......
  • *20. Valid Parentheses[Easy]
    20.ValidParenthesesGivenastringscontainingjustthecharacters'(',')','{','}','['and']',determineiftheinputstringisvalid.Aninputstring......
  • 二. Intellij IDEA 巅峰操作- IDEA 配置
    配置1.界面优化原则:界面元素越小,界面利用效率越高不同的色彩在视觉上更容易体现不同元素的差异基于以上两点,可以通过相关插件以及IDEA本身的配置来对界面进......
  • 一. Intellij IDEA 巅峰操作-引言
    引言为什么标题叫"巅峰操作"?为了致敬小饭的《巅峰之智》系列笔者在指导或者观察其他开发人员进行开发的过程中发现,很多开发人员的对于IDEA的使用效率较低,出现的......
  • 分布式存储
    分布式存储红帽旗下有两款分布式存储:Gluster/Cephglusterfs存储不能使用根目录/下面的一级目录,会报错副本机制,数据安全安装安装1台或2台分布式存储系统选择RedHatE......
  • laravel出现Please provide a valid cache path.
    访问首页出现如下提示:Pleaseprovideavalidcachepath.解决方法如下:1、确保storage目录下有如app,framework,views三个目录。2、确保storage/framework目录下也有cach......
  • 分布式操作系统具体是指什么操作系统?全篇干货
    分布式操作系统是一类操作系统,其中多台计算机组成一个逻辑上的单一系统。这些计算机可以在物理上分布在不同地点,也可以在同一地点。分布式操作系统的历史可以追溯到196......
  • IdentityServer4源码解析_2_元数据接口
    1|0目录IdentityServer4源码解析_1_项目结构IdentityServer4源码解析_2_元数据接口IdentityServer4源码解析_3_认证接口IdentityServer4源码解析_4_令牌发放接口Id......
  • Obsidian + Cubox 实现网页剪藏本地保存
    问题/需求:网页剪藏内容保存到本地/icloud云盘。保存文件格式便于迁移,可跨应用。网页中的图片能够快捷的保存到本地,避免图片链接失效。如何解决:环境:macos12.1应用......