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

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

    生成32位永不重复的随机数作为id,java开发中经常用到,包里是apache的2个jar

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

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

    Java 数据库主键生成类 IdWorker

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

    雪花算法java版实现

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

    分布式ID雪花算法 工具类.rar

    分布式系统,全局唯一ID,高效,永不重复。相比较uuid,雪花id是按照时间有序生成的,方便sql优化

    自动生成主键uuid.zip

    使用Java的Util.UUID生成32位的有序与无序id

    IdUtil4Spzp.java

    Twitter的 Snowflake JAVA实现方案,id生成器。高效生成15位的有序的数字类型id,亲测可用

    IdWorker.java

    Twitter的雪花算法SnowFlake,使用Java代码实现。 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位...有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。

    邮件发送 poi 二维码 条形码等java常用的工具类

    Identification:id生成工具类,包括 UUID luhn算法id(适用于有序的流水号码) ImgUtil:图片相似度计算工具 ItvJsonUtil:基于fastjson的json工具类 JsonUtility:基于jackjson的接送工具类 MailUtil:邮件...

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

    雪花算法分布式ID生成器 该项目的目的是提供一个轻量级、高并发、高可用的生成唯一ID的服务,生成的ID是一个64位的 长整型,全局唯一,保持递增,相对有序。...一个ID生成器,所以得到的ID都是递增、有序的。 H

    sequence:具有全局唯一,粗略顺序,高性能,高可用性,可伸缩性和其他特征的分布式ID生成器

    可以利用时间的有序性, 并且在某个时间单元下采用自增序列 粗略有序 在分布式系统中, 难以做到绝对有序, 因此可以采用相对有序的方式 可反解 一个 ID 在生成后, 本身就带有很多信息量, 在存储层面可以省下传统的 ...

    SnowFlake:Twitter的分布式自增ID雪花算法snowflake(Java版)

    而twitter的snowflake解决了这种需求,最初是Twitter把存储系统从MySQL迁移到Cassandra,因为Cassandra没有顺序的ID生成机制,所以开发了这样一套唯一的ID生成服务。结构雪花的结构如下(每部分用-分开): 0 - ...

    经历BAT面试后总结的【高级Java后台开发面试指南】,纯净干货无废话,针对高频面试点

    ID生成方式 一致性hash 限流 微服务 微服务介绍 服务发现 API网关 服务容错保护 服务配置中心 算法 数组-快速排序-第k大个数 数组-对撞指针-最大蓄水 数组-滑动窗口-最小连续子数组 数组-归并排序-合并有序数组 链表...

    Java基于Netty实现的高性能分布式IM即时通信系统源码+项目说明.tar

    | rim-id-generator | ID生成层:生成群聊、单聊的消息id | ## 亮点 + 设计模式 + 使用策略模式实现Client的各种内置命令、Netty接收消息处理、Router转发逻辑等功能 + 使用读扩散实现群聊离线消息拉取 + 使用...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    leetcode手册JAVA-LeetCode:LeetCode练习题,TDD

    leetcode手册JAVA LeetCode 实践 解决方案清单 不。 ID。 名称 解决方案 最后更新 1 二和 2020-09-09 21:42 2 两个数字相加 2020-09-06 18:42 3 无重复字符的最长子串 2020-09-06 18:42 4 两个有序数组的中位数 2020...

    spring boot整合mybatis利用Mysql实现主键UUID的方法

    主要给大家介绍了关于spring boot整合mybatis利用Mysql实现主键UUID的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

    leetcode285-leetcode:leetcode

    ID problem 难度 使用语言 思路 提交次数 WA点 star 1 两数之和 简单 C++ 2 两数相加 中等 Java 3 无重复字符的最长子串 中等 Java 5 最长回文子串 中等 python 7 整数反转 简单 python 8 字符串转换整数(atoi) 中等...

    javalruleetcode-Leetcode:力码

    ID 问题 Java Python 暗示 困难 1 二和 √ √ 哈希图 简单的 2 两个数字相加 √ √ 中等的 3 无重复字符的最长子串 √ √ 中等的 4 两个有序数组的中位数 √ √ 难的 5 最长回文子串 √ √ 中等的 8 字符串到整数 ...

    最全Hibernate 参考文档

    6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 三重关联(Ternary associations) 6.3.4. 使用 6.4. 集合例子(Collection example) 7. 关联关系映射 7.1. 介绍 ...

Global site tag (gtag.js) - Google Analytics