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

分布式uuid生成器- snowflake java 版

阅读更多
package tools;

import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * User: FR
 * Time: 12/22/14 5:53 PM
 * 测试每秒270w的id生成能力
 */
public class UUID {

    private Long HORIZON_MILLI=1419242747142L;
    private final static Integer SEQUENCE_BITS=12;
    private final static Integer WORK_ID_BITS=5;
    private final static Integer DATA_CENTER_BITS=5;
    private final static Integer MILLI_SECOND_BITS=41;
    private final static Integer MAX_SEQUENCE=-1 ^ (-1<<SEQUENCE_BITS);
    private final static Integer MAX_WORK_ID=-1 ^ (-1<<WORK_ID_BITS);
    private final static Integer MAX_DATA_CENTER_ID=-1 ^ (-1 << DATA_CENTER_BITS);
    private final static Long MAX_MILLISECONDS = -1L ^ (-1L << MILLI_SECOND_BITS);

    private final static Integer MILLI_SHIFT= DATA_CENTER_BITS + WORK_ID_BITS + SEQUENCE_BITS;
    private final static Integer DATA_CENTER_SHIFT= WORK_ID_BITS + SEQUENCE_BITS;
    private final static Integer WORK_ID_SHIFT= SEQUENCE_BITS;


    private Integer work_id=1;
    private Integer data_center_id=1;


    private long sequence = 0;
    private long lastTimestamp=0;

    public UUID(Integer workId, Integer dataCenterId) {
        if((workId & MAX_WORK_ID) == 0){
            throw new RuntimeException("work id is too large");
        }
        if((dataCenterId & MAX_DATA_CENTER_ID) == 0){
            throw new RuntimeException("data center id is too large");
        }
        this.work_id = workId;
        this.data_center_id = dataCenterId;
    }

    public synchronized long nextId(){
        long milliseconds = System.currentTimeMillis();
        if(this.lastTimestamp == milliseconds){
            this.sequence = (this.sequence+1) & MAX_SEQUENCE;
            if(this.sequence == 0){
                milliseconds = tilNextMillis(this.lastTimestamp);
            }
        }else if(milliseconds < this.lastTimestamp){
            throw new RuntimeException("clock wrong");
        }else {
            this.sequence = 0;
        }
        this.lastTimestamp = milliseconds;
        if(((milliseconds-HORIZON_MILLI) & MAX_MILLISECONDS) == 0){
            throw new RuntimeException("time is too large");
        }
        long nextId = ((milliseconds-HORIZON_MILLI)<<MILLI_SHIFT)+(this.data_center_id<<DATA_CENTER_SHIFT)+(this.work_id<<WORK_ID_SHIFT)+this.sequence;
        return nextId;
    }

    private long tilNextMillis(final long lastTimestamp) {
        long timestamp = System.currentTimeMillis();
        while (timestamp <= lastTimestamp) {
            timestamp = System.currentTimeMillis();
        }
        return timestamp;
    }

    public static void main(String[] args) throws InterruptedException {
        final AtomicInteger counter = new AtomicInteger(0);
        final ConcurrentHashMap set = new ConcurrentHashMap();
        final UUID uuid = new UUID(31, 1);
        final CountDownLatch countDownLatch = new CountDownLatch(100);
        final long start = System.currentTimeMillis();
        for (int i=0; i<100; i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    while ((System.currentTimeMillis() - start)<6000){
                        long id = uuid.nextId();
                        set.put(id, "");
                        counter.incrementAndGet();
                    }
                    countDownLatch.countDown();
                }
            }).start();
        }
        countDownLatch.await();
        long end = System.currentTimeMillis();
        System.out.println("use time " + (end - start));
        System.out.println(counter.get() + "");
        System.out.println(set.keySet().size());
    }

    public static void main1(String[] args){
        System.out.println(Long.toBinaryString(MAX_MILLISECONDS));
        long start = System.currentTimeMillis();
        UUID uuid = new UUID(31, 1);
        Set<Long> set = new HashSet<Long>();
        while ((System.currentTimeMillis() - start)<6000){
            long id = uuid.nextId();
            set.add(id);
        }
        System.out.println(set.size());
    }
}

 

分享到:
评论

相关推荐

    分布式ID生成策略_snowflake算法

    在Java中实现Snowflake算法,一般会创建一个ID生成器类,包含以下关键步骤: 1. **初始化**: 设置起始时间戳和工作节点ID,这些值通常在系统启动时配置。 2. **ID生成**: 获取当前毫秒数,与起始时间戳相减得到...

    java 分布式 代码生成器 唯一ID

    结合上述信息,"idGenerate"这个文件很可能是包含了一个Java实现的分布式代码生成器项目,可能包含了Snowflake算法或者其他分布式ID生成策略的源代码。通过学习和理解这些代码,我们可以更好地掌握在Java环境中如何...

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

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

    分布式ID生成器解决方案SnowflakeX.docx

    分布式ID生成器是解决大规模系统中唯一标识符生成问题的关键技术。在数据库水平拆分的背景下,为了确保每个数据记录的唯一性,ID生成器变得尤为重要。本文将深入探讨一种名为SnowflakeX的分布式ID生成解决方案,它是...

    java 获取分布式唯一ID.雪花ID

    在Java开发中,生成分布式唯一ID是常见的需求,特别是在大数据量和高并发的场景下,保证每个记录的ID独特性至关重要。雪花ID(Snowflake ID)是一种被广泛采用的解决方案,由Twitter开源,其设计目标就是生成全局...

    distributed-id:基于netty4+twitter-snowFlake分布式Id生成之服务实现

    雪花算法分布式ID生成器 该项目的目的是提供一个轻量级、高并发、高可用的生成唯一ID的服务,生成的ID是一个64位的 长整型,全局唯一,保持递增,相对有序。基于twitter的雪花算法来生成ID,用于取代UUID那种无序、...

    分布式ID生成

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

    分布式数据库基石-id中的学问-徐海峰

    徐海峰在其讲解中展示了Id生成器在实际应用中需要考虑的需求和挑战,并提出了多种策略和架构设计,以应对分布式系统环境下对Id生成器的高要求。通过这些方法的合理运用,可以极大地提升分布式数据库的性能和可靠性,...

    Go-GolangMysql实现的分布式ID生成服务

    - ID生成器模块:负责与MySQL交互,获取新的ID。 - 请求处理器模块:接收来自客户端的请求,使用goroutine进行异步处理。 - 锁管理模块:实现分布式锁,防止ID分配冲突。 - 客户端接口:提供给其他系统调用的API接口...

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

    常见的ID生成策略有雪花算法、UUID、Twitter的Snowflake算法等。这些算法通常结合时间戳、节点标识和序列号,确保在全球范围内的分布式系统中生成的ID都是独一无二的。 从压缩包子文件的文件名称列表来看,"client...

    分布式系统ID生成器解决方案.docx

    因此,引入专门的分布式ID生成器解决方案成为必要。 ### UUID方案 UUID(Universally Unique Identifier)是一种常见的生成全局唯一ID的方法,但它存在一些问题: 1. **存储不便**:UUID由16字节的128位组成,通常...

    分布式唯一ID解决方案-雪花算法.docx

    ID生成器在应用程序中,经常需要全局唯一的ID作为数据库主键。如何生成全局唯一ID?首先,需要确定全局唯一ID是整型还是字符串?如果是字符串,那么现有的UUID就完全满足需求,不需要额外的工作。 SnowFlake算法...

    卡号密码批量生成器Smile

    为了解决这个问题,可以使用锁机制或者分布式ID生成服务(如Twitter的Snowflake或Google的UUID)来确保全局唯一性。 除了卡号生成,密码的安全性也是`卡号密码批量生成器Smile`需要关注的重点。通常,密码生成会...

    分布式锁+id生成器+限流工具

    在这个名为"Distributed-Kit"的压缩包中,我们找到了三个关键组件:分布式锁、ID生成器和限流工具。下面将详细解释这三个组件及其在分布式环境中的应用。 **分布式锁** 分布式锁是一种在分布式系统中实现同步控制的...

    一个分布式常用工具组件

    分布式序列号生成器如Twitter的Snowflake或者Facebook的V4 UUID,可以生成全局唯一的、有序的序列号。这些系统通常基于时间戳、工作节点ID和序列号进行组合,确保在分布式环境中的唯一性,同时保证生成序列号的顺序...

    全局唯一ID生成

    另一种流行的分布式ID生成器是MongoDB的ObjectID。每个ObjectID包含时间戳、机器标识、进程标识和随机数,同样能保证全局唯一性,且长度较短,适合数据库存储。 除了上述方案,还有一些基于特定硬件(如GPU或TPU)...

    最新整理Java面试题

    - **分布式ID生成**:Snowflake、UUID、Twitter的Twitter Snowflake、以及基于数据库的自增ID。 - **分布式缓存**:Redis、Memcached的使用场景与操作,以及缓存穿透、缓存雪崩、缓存击穿问题的解决方案。 以上是...

    最热门的Java 分布式面试题汇总

    18. 分布式ID生成:可使用雪花算法、UUID、MongoDB自增ID、Twitter的Snowflake或分布式ID生成服务如Seq。 19. 分布式事务解决方案:两阶段提交、三阶段提交、Saga、分布式事务协调器(如X/Open XA)等。 20. 大...

    JAVA核心知识点整理.zip

    - **分布式ID生成**:如Snowflake算法、UUID等。 - **分布式锁**:解决分布式环境下的一致性问题。 这个压缩包中的"JAVA核心知识点整理.pdf"文件应该包含了以上所有领域的详细讲解和实例,对于Java开发者来说是一...

    Java互联网企业面试真题

    - 分布式ID生成:了解Snowflake算法、UUID等ID生成策略。 - 微服务:研究Docker、Kubernetes等容器化和编排技术。 以上知识点只是冰山一角,Java互联网企业面试真题可能还包括其他领域,如网络编程、大数据处理、...

Global site tag (gtag.js) - Google Analytics