当前位置:首页 > 开发 > 行业应用 > 正文

分布式id生成器,互联网

发表于: 2016-10-11   作者:tangzhibin   来源:转载   浏览:
摘要: 简单的分布式id生成器,10位时间戳(秒)+自增id+2位机器id,应该能满足一般的应用了;原创,转载请注明出处 /** * *@Title:DistributedIdGenerator.java *@Description:分布式id生成器(10位时间戳(秒)+自增id+2位机器id)集群中能保证唯一(必须配置serverNums机器数) *@date2016年8月10日 *@v
简单的分布式id生成器,10位时间戳(秒)+自增id+2位机器id,应该能满足一般的应用了;原创,转载请注明出处

/**
 * 
* @Title: DistributedIdGenerator.java 
* @Description: 分布式id生成器 (10位时间戳(秒)+自增id+2位机器id)集群中能保证唯一(必须配置serverNums机器数)
* @date 2016年8月10日 
* @version V1.0
 */
public class DistributedIdGenerator {
		
	static String SERVER_ID_PREFIX=getServerId();
	
	static final String EMPTY="";
	

	final Map<Integer,Integer> secondSequenceMap=new ConcurrentHashMap<Integer, Integer>();

	
	public DistributedIdGenerator(int serverNums){
		
	}
	
	public DistributedIdGenerator(){
		
	}
	
	
	public synchronized long generateId(){
		long time = System.currentTimeMillis();
		int second=(int) (time/1000L);
		int sequence=0;
		if(secondSequenceMap.containsKey(second)){
			 sequence=secondSequenceMap.get(second);
		}else{
			secondSequenceMap.clear();
		}
		sequence++;
		secondSequenceMap.put(second, sequence);
		return Long.valueOf(second+EMPTY+sequence+SERVER_ID_PREFIX);
	}
	
	/**
	 * 此处有待斟酌 pid还是有概率会重复的(尽管加上了随机数)
	 * @return
	 */
	private static String getServerId(){
		String name = ManagementFactory.getRuntimeMXBean().getName();  
		String pid = name.split("@")[0]; 
		int random=new Random().nextInt(10);
		if(pid.length()<=1){
			pid=pid+""+random;
		}
		if(pid.length()>2){
			pid=pid.substring(0, 2);
		}
		if(random==0){
			random=1;
		}
		return random+pid;
	}
	
	public static void main(String[] args) throws Exception {
		final Map<Long,Long> sets = new ConcurrentHashMap<Long,Long>();
		final AtomicInteger counts = new AtomicInteger(0);

		final DistributedIdGenerator idGen = new DistributedIdGenerator(1);

		List<Callable<Long>> partitions = new ArrayList<Callable<Long>>();

		for (int i = 0; i < 100; i++) {
			partitions.add(new Callable<Long>() {
			
				@Override
				public Long call() throws Exception {
					for(int j=0;j<10000;j++){
						long id = idGen.generateId();
						System.out.println(id);
						if (sets.containsKey(id) ){
							counts.incrementAndGet();
						}
						sets.put(id, id);
					}
					return 0l;
				}
				
			});
		}
		ExecutorService executorPool = Executors.newFixedThreadPool(Runtime
				.getRuntime().availableProcessors()*4);
		try {
			long s = System.currentTimeMillis();
			executorPool.invokeAll(partitions);
			long s_avg = System.currentTimeMillis() - s;
			System.out.println("完成时间需要: " + s_avg / 1.0e3 + "秒");
			executorPool.shutdown();
		} catch (Exception e) {
			e.printStackTrace();
		}

		System.out.println("重复数:"+counts.get());
		long time = System.currentTimeMillis();
		int second=(int) (time/1000L);
		System.out.println(second);
	}
	

}


分布式id生成器,互联网

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
1.Apache Ignite的分布式原子化类型 JDK在1.5版本之后,提供了java.util.concurrent包,其中java.ut
.Net 互联网技术(一)分布式ID生成方法生成演变 一、需求缘起转载至 几乎所有的业务系统,都有生成
一、需求缘起 几乎所有的业务系统,都有生成一个记录标识的需求,例如: (1)消息标识:message-id
<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnbl
<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnbl
百度BBS收录协议-生成器 无论对于普通网民还是搜索引擎,论坛中的信息无疑是一块最重要,甚至最大的
百度BBS收录协议-生成器 无论对于普通网民还是搜索引擎,论坛中的信息无疑是一块最重要,甚至最大的
百度BBS收录协议-生成器 无论对于普通网民还是搜索引擎,论坛中的信息无疑是一块最重要,甚至最大的
百度BBS收录协议-生成器 无论对于普通网民还是搜索引擎,论坛中的信息无疑是一块最重要,甚至最大的
百度BBS收录协议-生成器 无论对于普通网民还是搜索引擎,论坛中的信息无疑是一块最重要,甚至最大的
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号