`
tangzhibin
  • 浏览: 20679 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

分布式id生成器,互联网

阅读更多
简单的分布式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);
	}
	

}


0
1
分享到:
评论

相关推荐

    通用、灵活、高性能的分布式 ID 生成器

    分布式ID生成器是现代互联网系统中的重要组成部分,它在大数据量和高并发的场景下扮演着关键角色。本文将深入探讨“通用、灵活、高性能”的分布式ID生成器的设计原理、实现方式以及它在服务器应用和分布式服务/框架...

    分布式ID生成策略_snowflake算法

    分布式ID生成策略是现代互联网应用中的重要组成部分,尤其是在大数据时代,每个数据实体通常都需要一个唯一标识符(ID)来区分其身份。Snowflake算法是由Twitter开源的一种高效且可扩展的分布式ID生成方案,广泛应用...

    分布式ID生成器 VESTA

    分布式ID生成器 VESTA 是一个专为解决大型分布式系统中唯一标识符生成问题而设计的工具。在现代互联网应用中,随着业务的扩展和数据量的增长,单一服务器已无法满足高并发、高性能的需求,因此分布式系统应运而生。...

    分布式ID生成器的解决方案总结.docx

    分布式ID生成器是大型互联网系统中不可或缺的一部分,其主要任务是为系统中的各种实体生成全局唯一的标识符(ID)。在复杂分布式环境下,选择合适的ID生成策略对于系统的性能、可用性和可扩展性至关重要。以下是几种...

    分布式ID生成器 VESTA-jar+源码

    分布式ID生成器 VESTA-jar+源码 Vesta是一款通用的ID产生器,互联网俗称统一发号器,它具有全局唯一、粗略有序、可反解和可制造等特性,它支持三种发布模式:嵌入发布模式、中心服务器发布模式、REST发布模式,根据...

    分布式ID生成

    在设计分布式ID生成器之前,我们需要明确几个关键需求: 1. **全局唯一**:生成的ID在整个系统中必须是唯一的,即使是在分布式环境中也需满足这一条件。 2. **趋势有序**:虽然不要求ID绝对递增,但希望它们能够在...

    分步式主键发生器,适合分布式应用的id唯一性

    标题“分步式主键发生器,适合分布式应用的id唯一性”所涉及的知识点主要是分布式系统中的ID生成策略。分布式主键发生器的设计目标是确保在分布式环境下的各个节点能够独立且无冲突地生成唯一的ID,以满足数据库表中...

    美团点评分布式id项目 Leaf jar包依赖

    Leaf作为美团点评的开源分布式ID生成系统,凭借其高效、灵活的特性,已经成为了许多大型互联网公司处理分布式唯一标识问题的首选方案。正确理解和使用Leaf的jar包依赖,能够帮助我们轻松地在项目中引入这一强大的ID...

    ID生成器idCreator.zip

    idCreator是我们设计并且开发一个分布式的id生成器。它主要为业务系统提供唯一、索引友好、 可排序的id。它解决了互联网行业中,使用int自增id或者是string类型的自定义id而导致的 无法方便的分库分表或者是id排序不...

    uidGenerator.rar

    分布式ID生成器是现代互联网系统中不可或缺的一部分,尤其是在大数据量、高并发的场景下,确保全局唯一ID的生成显得尤为重要。百度开源的`uidGenerator`就是这样一个工具,它旨在为服务提供高效、稳定的分布式ID生成...

    redis-id-generator

    其特点是数据持久化、网络延迟低以及操作原子性,这些特性使得 Redis 成为了实现分布式ID生成器的理想选择。 在 **Redis-ID-Generator** 中,关键的设计思路是利用 Redis 的 INCR 命令。INCR命令会原子性地将键...

    Java实现Twitter的分布式自增ID算法snowflake

    总结来说,Java实现的Twitter Snowflake算法是一种高效、有序的分布式自增ID生成器,适用于需要全局唯一标识且对时间顺序有要求的系统。通过合理的位分配,它能够在分布式环境中提供线性扩展性和时间上的顺序性。

    分布式事务-最终一致性

    1. **分布式ID机制**:Transaction ID是跟踪和协调分布式事务的核心,因此需要使用分布式ID生成器,确保每个事务的ID全局唯一,避免因ID重复导致的问题。 2. **本地事务**:在每个参与分布式事务的服务中,都需要...

    CosId-main.zip

    CosId,作为一个通用、灵活且高性能的分布式ID生成器,为解决这一问题提供了强大的解决方案。 首先,我们来深入了解CosId的核心特性。CosId的主要目标是提供全局唯一且具有时间序列性的ID,这对于数据的存储和查询...

    跟踪分布式系统

    2. **追踪ID生成**:为每个请求生成一个唯一的追踪ID,确保请求在整个分布式系统中的可追溯性。 3. **数据收集**:收集到的追踪信息会被发送到Hydra的数据收集器,如Zipkin、Jaeger或者自定义的存储后端。 4. **可视...

    Java高级互联网MCA架构师 美团leaf源码分析

    美团leaf,作为美团公司开源的一个分布式ID生成器,为了解决互联网应用中唯一ID的需求,提供了高效且可扩展的解决方案。本篇将深入探讨leaf的源码,以帮助Java高级互联网MCA架构师更好地理解和应用这一技术。 首先...

    分布式追踪-DaoCloud 谭建王垚.pdf

    1. 追踪数据的生成:分布式追踪的第一步是生成追踪数据。这通常涉及到在系统的关键点(例如服务之间的调用、数据库查询、外部API调用等)嵌入追踪代码。这些代码能够在每次调用发生时记录相关信息,比如时间戳、调用...

    分布式架构下的会话追踪实践【基于Cookie和Redis实现】

    分布式架构下的会话追踪实践是现代互联网应用中不可或缺的一部分,特别是在高并发、大规模用户场景下。本实践将探讨如何在分布式环境中实现会话追踪,主要采用Cookie和Redis这两种技术手段。 首先,我们要理解会话...

    基于webmagic框架实现的文娱类分布式爬虫.zip

    4. **分布式策略**:使用分布式ID生成器(如Snowflake)为每个URL生成唯一标识,避免不同节点间冲突。 5. **结果合并**:设计Pipeline处理各节点爬取的结果,确保数据的一致性和完整性。 【四、具体实现步骤】 1. ...

Global site tag (gtag.js) - Google Analytics