`
wb284551926
  • 浏览: 551577 次
文章分类
社区版块
存档分类
最新评论

IdWorker

 
阅读更多
package com.rrjc.pf.common;
  import java.net.InetAddress;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
   
  /**
  * (a) id构成: 42位的时间前缀 + 10位的节点标识 + 12位的sequence避免并发的数字(12位不够用时强制得到新的时间前缀)
  * 注意这里进行了小改动: snowkflake是5位的datacenter加5位的机器id; 这里变成使用10位的机器id
  * (b) 对系统时间的依赖性非常强,需关闭ntp的时间同步功能。当检测到ntp时间调整后,将会拒绝分配id
  */
  public class IdWorker {
  private final static Logger logger = LoggerFactory.getLogger(IdWorker.class);
  private final long workerId;
  private final long epoch = 1403854494756L; // 时间起始标记点,作为基准,一般取系统的最近时间
  private final long workerIdBits = 10L; // 机器标识位数
  private final long maxWorkerId = -1L ^ -1L << this.workerIdBits;// 机器ID最大值: 1023
  private long sequence = 0L; // 0,并发控制
  private final long sequenceBits = 12L; //毫秒内自增位
   
  private final long workerIdShift = this.sequenceBits; // 12
  private final long timestampLeftShift = this.sequenceBits + this.workerIdBits;// 22
  private final long sequenceMask = -1L ^ -1L << this.sequenceBits; // 4095,111111111111,12位
  private long lastTimestamp = -1L;
  private IdWorker(long workerId) {
  if (workerId > this.maxWorkerId || workerId < 0) {
  throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", this.maxWorkerId));
  }
  this.workerId = workerId;
  }
   
  public synchronized long nextId() throws Exception {
  long timestamp = IdWorker.timeGen();
  if (this.lastTimestamp == timestamp) { // 如果上一个timestamp与新产生的相等,则sequence加一(0-4095循环); 对新的timestamp,sequence从0开始
  this.sequence = this.sequence + 1 & this.sequenceMask;
  if (this.sequence == 0) {
  timestamp = this.tilNextMillis(this.lastTimestamp);// 重新生成timestamp
  }
  } else {
  this.sequence = 0;
  }
   
  if (timestamp < this.lastTimestamp) {
  logger.error(String.format("clock moved backwards.Refusing to generate id for %d milliseconds", (this.lastTimestamp - timestamp)));
  throw new Exception(String.format("clock moved backwards.Refusing to generate id for %d milliseconds", (this.lastTimestamp - timestamp)));
  }
   
  this.lastTimestamp = timestamp;
  return timestamp - this.epoch << this.timestampLeftShift | this.workerId << this.workerIdShift | this.sequence;
  }
   
  private static IdWorker flowIdWorker = new IdWorker(getworkerHostIp());
  public static IdWorker getFlowIdWorkerInstance() {
  return flowIdWorker;
  }
  /**
  * 等待下一个毫秒的到来, 保证返回的毫秒数在参数lastTimestamp之后
  */
  private long tilNextMillis(long lastTimestamp) {
  long timestamp = IdWorker.timeGen();
  while (timestamp <= lastTimestamp) {
  timestamp = IdWorker.timeGen();
  }
  return timestamp;
  }
  /**
  * 获得系统当前毫秒数
  */
  private static long timeGen() {
  return System.currentTimeMillis();
  }
  /**
  *
  * @param bytes
  * @return int
  */
  public static int getworkerHostIp() {
  try {
  byte[] bytes = InetAddress.getLocalHost().getAddress();
  return Integer.valueOf(bytes[3] & 0xFF);
  } catch (Exception e) {
  logger.error(e.getMessage(),e);
  return 1;
  }
   
  }
  public static void main(String[] args) throws Exception {
  IdWorker idWorker = IdWorker.getFlowIdWorkerInstance();
  System.out.println(idWorker.nextId());
  System.out.println(idWorker.nextId());
  }
 

}

 

源地址:https://gist.github.com/xishuixixia/f0f8684805d0504289b7a40f3b327dd6

分享到:
评论

相关推荐

    Java 数据库主键生成类 IdWorker

    高并发分布式系统中生成全局唯一Id汇总 数据在分片时,典型的是分库分表,就有一个全局ID生成的问题。 单纯的生成全局ID并不是...IdWorker worker2 = new IdWorker(2); System.out.println(worker2.nextId()); } }

    Algorithm-idworker.zip

    "Algorithm-idworker.zip"是一个包含特定算法实现的压缩文件,主要关注的是"idworker",一个用于生成唯一ID的算法。这个算法在分布式系统中尤为重要,因为它能确保在多台服务器之间生成全局唯一的标识符,避免ID冲突...

    IdWorker.java

    ID生成工具类(直接复制到项目里即可使用),简单快捷,只需在需要唯一ID时new IdWorker().nextId()即可,产生的ID不重复

    IdWorker(1).zip_ropejst_分布式自增长ID

    `IdWorker`是阿里巴巴开源的一个高效、可扩展的分布式ID生成器,它确保了在大规模分布式环境下的ID唯一性、有序性和高性能。`RopeJST`可能是对这个实现的一种特定优化或变体,但在这个描述中并没有明确提到`RopeJST`...

    IdWorker.txt

    根据给定文件的信息,我们可以总结出以下关于雪花算法(IdWorker)的关键知识点: ### 雪花算法概述 雪花算法(Snowflake Algorithm)是一种分布式ID生成算法,最初由Twitter开发并用于其内部系统,目的是为了在分布式...

    idworker:idworker是一个基于zookeeper和snowflake算法的分布式ID生成工具,通过zookeeper自动注册机器(最多1024台),无需手动指定workerId和datacenterId

    idworker-基于zookeeper,snowflake的分布式统一ID生成工具 是什么 idworker是一个基于zookeeper和snowflake算法的分布式统一ID生成工具,通过zookeeper自动注册机器(最多1024台),无需手动指定workerId和...

    mybatis-plus分布式ID实现.rar

    项目中的代码截取自mybatis-plus-3.5项目源码中分布式ID的实现,主要是内容是Mybatis-plus项目中IdentifierGenerator接口的两个实现类DefaultIdentifierGenerator和ImadcnIdentifierGenerator的源码,还有IdWorker工具...

    Java工具类CookieUtils、IdWorker、JsonUtils、NumberUtils

    工具类CookieUtils、IdWorker、JsonUtils、NumberUtils Java工具类

    idworker-client

    **idworker 客户端详解** `idworker-client` 是一个专为分布式系统设计的唯一ID生成器的客户端实现,它基于`idworker`项目,主要用于解决在分布式环境中的ID生成问题。`idworker`由淘宝团队开发,其设计目标是提供...

    SnowflakeIdWorker.java

    * * 得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。41位的时间截,可以使用69年,年T = (1L ) / (1000L * 60 * 60 * 24 * ...

    雪花算法IdWorker.java

    雪花算法IdWorker.java

    大数据一秒生成5000000不重复ID

    大数据一秒生成5000000不重复ID SnowflakeIDWorker 用到 long timestamp = timeGen(); timestamp 以及上一个 timestamp 加位移.

    mybatis-plus实体类主键策略有3种(小结)

    class IdWorker { // ... public synchronized long nextId() { return workerId | (sequence ) | (workerId ) | (sequence &gt;&gt;&gt; 8); } } ``` 这个生成器确保在多台机器上生成的 ID 互不相同,且有一定的顺序...

    利用mysql实现的雪花算法案例

    《MySQL实现雪花算法详解》 在当今的互联网环境中,分布式系统和微服务架构越来越常见,随之而来的是数据库的拆分与分表需求。在这种背景下,如何生成全局唯一且不重复的ID成为了一个重要的问题。...

    generator.rar

    "generator.rar"这个压缩包文件,特别是其中的"IdWorker.java",是关于Sharding-JDBC中键(ID)生成策略的一个补充和强化,通常涉及到自定义ID生成器的实现。 Sharding-JDBC提供了多种键生成策略,包括雪花算法...

Global site tag (gtag.js) - Google Analytics