码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-05-23 14:21:39      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:

/**<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());
	}
	

}


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

标签:

原文地址:http://my.oschina.net/u/1995545/blog/418891

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!