`
BucketLi
  • 浏览: 195834 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
5a76a659-f8e6-3bf3-b39a-8ae8f7a0f9d9
Percolator与分布...
浏览量:5686
社区版块
存档分类
最新评论

java时间有序id生成

阅读更多
package com.taobao.metamorphosis.server.utils;

import com.taobao.metamorphosis.server.exception.InvalidSystemClock;


/**
 * 来自于twitter项目<a
 * href="https://github.com/twitter/snowflake">snowflake</a>的id产生方案,全局唯一,时间有序
 * 
 * 
 * @see https://github.com/twitter/snowflake
 * @author boyan
 * @Date 2011-4-27
 * 
 */
public class IdWorker {
    private final long workerId;
    private final long twepoch = 1303895660503L;
    private long sequence = 0L;
    private final long workerIdBits = 10L;
    private final long maxWorkerId = -1L ^ -1L << this.workerIdBits;
    private final long sequenceBits = 12L;

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

    private long lastTimestamp = -1L;


    public IdWorker(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) {
                timestamp = this.tilNextMillis(this.lastTimestamp);
            }
        }
        else {
            this.sequence = 0;
        }
        if (timestamp < this.lastTimestamp) {
            throw new InvalidSystemClock(String
                .format("Clock moved backwards.  Refusing to generate id for %d milliseconds",
                    (this.lastTimestamp - timestamp)));
        }

        this.lastTimestamp = timestamp;
        return timestamp - this.twepoch << this.timestampLeftShift | this.workerId << this.workerIdShift
                | this.sequence;
    }


    private long tilNextMillis(long lastTimestamp) {
        long timestamp = this.timeGen();
        while (timestamp <= lastTimestamp) {
            timestamp = this.timeGen();
        }
        return timestamp;
    }


    private long timeGen() {
        return System.currentTimeMillis();
    }

}
分享到:
评论
1 楼 wqcva 2015-03-10  
在使用这个类的时候workerId应该怎么传

相关推荐

    自动生成ID(32位)所用jar

    例如,Snowflake算法是一种广泛使用的分布式ID生成策略,由Twitter开源。它生成的是64位的ID,其中包括时间戳、工作节点ID和序列号,可以保证全局唯一且按时间顺序排序。虽然Snowflake不是Apache Commons Lang的一...

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

    在Java分布式环境中,生成唯一的ID(唯一标识符)是一个至关重要的任务,特别是在高并发和大数据量的场景下。...通过学习和理解这些代码,我们可以更好地掌握在Java环境中如何设计和实现一个高效的分布式ID生成系统。

    Java实现分布式雪花ID生成代码

    索引此时就引入了雪花ID,它既能保证ID的有序性,又保证了ID的唯一性,兼顾自增ID和UUID的共同优点。 雪花ID的优点: 高性能高可用:生成时不依赖于数据库,完全在内存中生成。 容量大:每秒能生成数百万的自增ID。...

    自动生成不重复无序化id

    这是自动生成不重复主键的代码包,直接导包进入程序即可使用,帮助生成由字母数字组成的16位id号,可以用于数据库主键存储(使用数据库自增主键始终有问题,不适合大型程序的使用),该代码包运用于很多大型企业级...

    java自动生成ID号的方法

    在Java编程中,生成唯一的ID号是常见...如果需要有序ID且有分布式环境,雪花算法更合适;而简单的自增序列则适用于单机应用和对ID顺序有要求的场景。总之,了解各种方法的优缺点,结合实际需求,才能做出最适合的选择。

    java 生成有序账号的实现方法

    此外,如果账号生成需求更为复杂,比如需要考虑并发安全或者分布式环境,我们可以考虑使用原子操作(如`AtomicInteger`)或者分布式ID生成器(如Snowflake算法或UUID)来保证账号的唯一性和顺序性。 总结一下,Java...

    Java 数据库主键生成类 IdWorker

    twitter在把存储系统从MySQL迁移到Cassandra的过程中由于Cassandra没有顺序ID生成机制,于是自己开发了一套全局唯一ID生成服务:Snowflake。 1 41位的时间序列(精确到毫秒,41位的长度可以使用69年) 2 10位的机器...

    分布式ID生成策略_snowflake算法

    Snowflake算法是由Twitter开源的一种高效且可扩展的分布式ID生成方案,广泛应用于Java和其他编程语言的系统中。 Snowflake算法的核心思想是将64位的整数划分为不同的部分,分别为: 1. **时间戳**(41位):自定义...

    java生成数据库表序列号

    序列在数据库中是一个独立的对象,可以生成一系列有序的数字,这些数字通常用于主键或唯一标识字段。在Oracle中,我们可以创建一个序列,例如: ```sql CREATE SEQUENCE seq_example START WITH 1 INCREMENT BY 1; ...

    序列号生成器

    虽然在这个代码片段中没有直接被调用,但它可以用来作为数据中心ID或工作节点ID的一部分,以增强ID生成的唯一性和分布性。 #### 三、关键特性解读 ##### 3.1 唯一性保证 - **时间戳**:每个ID都包含了当前的...

    自动生成主键uuid.zip

    总结来说,"自动生成主键uuid.zip"中的内容可能涉及到如何在Java中使用UUID生成32位的无序和有序ID,这对于数据库主键或其他需要全局唯一标识的场景非常有用。通过理解UUID的生成机制和结合其他数据,开发者可以定制...

    java实现随机生成UUID

    这种方法在对时间顺序性有一定要求的场合非常有用,虽然它不是标准的UUID格式,但它提供了一种以时间为基础生成有序唯一ID的替代方案。 在实际的开发工作中,UUID因其在全局范围内的高度唯一性而被广泛应用。例如,...

    雪花算法java版实现

    twitter雪花算法的java实现,分布式系统中,有一些...而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移到Cassandra,因为Cassandra没有顺序ID生成机制,所以开发了这样一套全局唯一ID生成服务。

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

    如果需要有序ID,需要借助额外的存储,例如数据库。 2. UUID Java的UUID可以生成具有高唯一性的随机32位字符串,但不包含时间戳,不利于顺序分析,且可读性较差。 3. 数据库自增ID 数据库的自动递增主键是一种...

    基于Java代码实现游戏服务器生成全局唯一ID的方法汇总

    总结起来,选择哪种全局唯一ID生成方法取决于系统的规模、并发量、是否需要有序ID以及对性能的要求。对于大多数分布式系统,特别是游戏服务器,Snowflake算法通常是一个不错的选择,因为它提供了良好的性能和可扩展...

    Java之无序数生成

    这里,我们可以利用加密算法,将有序ID转化为看似无规律的序列。加密算法能够将有意义的数据变为看似无意义的形式,比如Caesar密码或AES加密。Caesar密码简单且易于实现,尽管安全性较低,但对于生成无序ID来说足够...

    分布式ID生成策略(1)_snowflake算法

    Snowflake算法就是一种被广泛使用的分布式ID生成方案,它由Twitter开源,具有时间戳、工作机器ID和序列号三部分组成,能够确保在分布式环境下生成的ID具有唯一性、有序性和高性能。 Snowflake算法的核心思想是将64...

    Twitter的分布式自增ID雪花算法snowflake

    雪花算法是Twitter开源的一种分布式ID生成算法,它能够生成全局唯一、递增且无碰撞的64位整数ID。这个算法在分布式系统中非常适用,因为传统的序列号生成方式在分布式环境中往往难以解决冲突问题。下面我们将详细...

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

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

Global site tag (gtag.js) - Google Analytics