分布式自增长ID(Twitter的 Snowflake JAVA实现方案 )

/**<p>项目名:</p>
 * <p>包名:	com.zdb.module.test</p>
 * <p>文件名:IdWorker.java</p>
 * <p>版本信息:</p>
 * <p>日期:2015-5-23-下午1:17:49</p>
 * Copyright (c) 2015singno公司-版权所有
 */
package com.zdb.module.test;

/**<p>名称:IdWorker.java</p>
 * <p>描述:分布式自增长ID</p>
 * <pre>
 *     Twitter的 Snowflake JAVA实现方案    
 * </pre>
 * @author 鲍建明
 * @date 2015-5-23 下午1:17:49
 * @version 1.0.0
 */
public class IdWorker {

	private final long workerId;
	private final static long twepoch = 1288834974657L;
	private long sequence = 0L;
	private final static long workerIdBits = 4L;
	public final static long maxWorkerId = -1L ^ -1L << workerIdBits;
	private final static long sequenceBits = 10L;

	private final static long workerIdShift = sequenceBits;
	private final static long timestampLeftShift = sequenceBits + workerIdBits;
	public final static long sequenceMask = -1L ^ -1L << sequenceBits;

	private long lastTimestamp = -1L;

	public IdWorker(final long workerId) {
	    super();
	    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() {
	    long timestamp = this.timeGen();
	    if (this.lastTimestamp == timestamp) {
	        this.sequence = (this.sequence + 1) & this.sequenceMask;
	        if (this.sequence == 0) {
	            System.out.println("###########" + sequenceMask);
	            timestamp = this.tilNextMillis(this.lastTimestamp);
	        }
	    } else {
	        this.sequence = 0;
	    }
	    if (timestamp < this.lastTimestamp) {
	        try {
	            throw new Exception(
	                    String.format(
	                            "Clock moved backwards.  Refusing to generate id for %d milliseconds",
	                            this.lastTimestamp - timestamp));
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	    }

	    this.lastTimestamp = timestamp;
	    long nextId = ((timestamp - twepoch << timestampLeftShift))
	            | (this.workerId << this.workerIdShift) | (this.sequence);
	    System.out.println("timestamp:" + timestamp + ",timestampLeftShift:"
	            + timestampLeftShift + ",nextId:" + nextId + ",workerId:"
	            + workerId + ",sequence:" + 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();
	}

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

}
时间: 2024-10-08 15:30:49

分布式自增长ID(Twitter的 Snowflake JAVA实现方案 )的相关文章

Twitter的分布式自增ID算法snowflake (Java版)

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

[转] Twitter的分布式自增ID算法Snowflake实现分析及其Java、Php和Python版

转载自:http://www.dengchuanhua.com/132.html 在分布式系统中,需要生成全局UID的场合还是比较多的,twitter的snowflake解决了这种需求,实现也还是很简单的,除去配置信息,核心代码就是毫秒级时间41位+机器ID 10位+毫秒内序列12位. 该项目地址为:https://github.com/twitter/snowflake是用Scala实现的. python版详见开源项目https://github.com/erans/pysnowflake.

Twitter的分布式自增ID算法snowflake(雪花算法) - C#版

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

转:snowflake分布式自增ID算法

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

理解分布式id生成算法SnowFlake

理解分布式id生成算法SnowFlake https://segmentfault.com/a/1190000011282426#articleHeader2 分布式id生成算法的有很多种,Twitter的SnowFlake就是其中经典的一种. 概述 SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图: 图片描述 1位,不用.二进制中最高位为1的都是负数,但是我们生成的id一般都使用整数,所以这个最高位固定是0 41位,用来记录时间戳(毫秒). 41位可以表示241?

图解分布式id生成算法SnowFlake

分布式id生成算法的有很多种,Twitter的SnowFlake就是其中经典的一种. 概述 SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图: 1位,不用.二进制中最高位为1的都是负数,但是我们生成的id一般都使用整数,所以这个最高位固定是0 41位,用来记录时间戳(毫秒). 41位可以表示241?1个数字, 如果只用来表示正整数(计算机中正数包含0),可以表示的数值范围是:0 至 241?1,减1是因为可表示的数值范围是从0开始算的,而不是1. 也就是说41位可以

snowflake 雪花算法 分布式实现全局id生成

snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID. 这种方案大致来说是一种以划分命名空间(UUID也算,由于比较常见,所以单独分析)来生成ID的一种算法,这种方案把64-bit分别划分成多段,分开来标示机器.时间等. 其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号,最后还有一个符号位,永远是0. 比如在snowflake中的64-bit分别表示如下图(图片来自网络)

C# 根据twitter的snowflake算法生成唯一ID

C# 版算法: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Demo 8 { 9 10 /// <summary> 11 /// 根据twitter的snowflake算法生成唯一ID 12 /// snowflake算法 64 位 13 /// 0---000

C# 分布式自增ID算法snowflake(雪花算法)

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