Twitter Snowflake 的Java实现

在关闭显示的情况下, 可以达到每毫秒3万个的生成速度

/**
 * An Implementation of Twitter Snowflake ID Generator
 */
public class SnowflakeId {
    private final static long EPOCH = 0L; // shift for smaller timestamp
    private final static long DEVICE_ID_BITS = 2L;
    private final static long SEQUENCE_BITS = 16L;
    private final static long MAX_WORKER_ID = -1L ^ -1L << DEVICE_ID_BITS; // 与& 非~ 或| 异或^, only the bit on WORKER_ID_BITS are 1
    private final static int SEQUENCE_MASK = (int)(-1L ^ -1L << SEQUENCE_BITS);

    private final long deviceId;
    private final RecyclableAtomicInteger atomic = new RecyclableAtomicInteger();
    private long lastTimestamp = -1L;

    public SnowflakeId(final long deviceId) {
        if (deviceId > MAX_WORKER_ID || deviceId < 0) {
            throw new IllegalArgumentException(
                    String.format("Device ID should be between 0 and %d", this.MAX_WORKER_ID));
        }
        this.deviceId = deviceId;
    }

    public long nextId() {
        long timestamp = millisecond();
        if (timestamp < lastTimestamp) {
            throw new IllegalArgumentException(
                    String.format("Wait %d milliseconds", lastTimestamp - timestamp));
        }

        if (lastTimestamp == timestamp) {
            int sequence = atomic.incrementAndRecycle(SEQUENCE_MASK);
            if (sequence == 0) {
                timestamp = waitTilNextMillis(lastTimestamp);
                lastTimestamp = timestamp;
            }
            return (timestamp - EPOCH << (SEQUENCE_BITS + DEVICE_ID_BITS)) | (deviceId << SEQUENCE_BITS) | sequence;
        } else {
            atomic.set(0);
            lastTimestamp = timestamp;
            return (timestamp - EPOCH << (SEQUENCE_BITS + DEVICE_ID_BITS)) | (deviceId << SEQUENCE_BITS);
        }
    }

    private long waitTilNextMillis(final long lastTimestamp) {
        System.out.print(lastTimestamp);
        long timestamp;
        for (;;) {
            timestamp = this.millisecond();
            System.out.print(‘+‘);
            if (timestamp > lastTimestamp) {
                System.out.print("\n");
                return timestamp;
            }
        }
    }

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

    public static void main(String[] args) {
        SnowflakeId worker = new SnowflakeId(1);
        long start = System.currentTimeMillis();
        for (int i = 0; i < 5000000; i ++) {
            //System.out.println(worker.nextId());
            worker.nextId();
        }
        long duration = System.currentTimeMillis() - start;
        System.out.println("Total: " + duration + "ms, " + 5000000/duration + "/ms");
    }
}
时间: 2024-10-13 11:57:49

Twitter Snowflake 的Java实现的相关文章

分布式自增长ID(Twitter的 Snowflake JAVA实现方案 )

/**<p>项目名:</p>  * <p>包名: com.zdb.module.test</p>  * <p>文件名:IdWorker.java</p>  * <p>版本信息:</p>  * <p>日期:2015-5-23-下午1:17:49</p>  * Copyright (c) 2015singno公司-版权所有  */ package com.zdb.module.test; /

snowflake算法(java版)

 转自:http://www.cnblogs.com/haoxinyue/p/5208136.html 1. 数据库自增长序列或字段 最常见的方式.利用数据库,全数据库唯一. 优点: 1)简单,代码方便,性能可以接受. 2)数字ID天然排序,对分页或者需要排序的结果很有帮助. 缺点: 1)不同数据库语法和实现不同,数据库迁移的时候或多数据库版本支持的时候需要处理. 2)在单个数据库或读写分离或一主多从的情况下,只有一个主库可以生成.有单点故障的风险. 3)在性能达不到要求的情况下,比较难于扩展.

通过rest接口获取自增id (twitter snowflake算法)

1.  算法介绍 参考 http://www.lanindex.com/twitter-snowflake%EF%BC%8C64%E4%BD%8D%E8%87%AA%E5%A2%9Eid%E7%AE%97%E6%B3%95%E8%AF%A6%E8%A7%A3/ Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的id,这些id还需要一些大致的顺序(方便客户端排序),并且在分布式系统中不同机器产生的id必须不同. Sno

[转] Twitter的分布式自增ID算法Snowflake实现分析及其Java、Php和Python版

转载自:http://www.dengchuanhua.com/132.html 在分布式系统中,需要生成全局UID的场合还是比较多的,twitter的snowflake解决了这种需求,实现也还是很简单的,除去配置信息,核心代码就是毫秒级时间41位+机器ID 10位+毫秒内序列12位. 该项目地址为:https://github.com/twitter/snowflake是用Scala实现的. python版详见开源项目https://github.com/erans/pysnowflake.

twitter的snowflake算法

推特的工程师snowflake也提出了一个在分布式系统中生成唯一序列的方法: java中的UUID也是一种可取的方法,他的缺点是序列号太长了. snowflake算法最原始的形式是用scala语言写的https://github.com/twitter/snowflake/releases/tag/snowflake-2010 核心代码为其IdWorker这个类实现,其原理结构如下,分别用一个0表示一位,用—分割开部分的作用: 1 0---0000000000 0000000000 000000

我爱java系列之---【分布式ID生成解决方案:UUID、Redis生成id、snowflake】

唯一id生成方案: a. 使用UUID生成唯一主键: 优点: 全局唯一. 缺点: 因为生成的内容是字符串, 不能排序, 不能按照时间先后排序,因为生成的是字符串类型的id, 可读性差. b. 使用redis来生成全局唯一主键: 优点: redis是内存操作, 速度快, 生成的是数字, 可读性好, 并且可以按照生成的时间先后排序. 缺点: 如果整个系统没有用到redis技术, 那么这里使用redis会增加系统的技术复杂度.   应用服务器到redis服务器获取唯一id, 增加网络io. c. sn

Twitter的分布式自增ID算法snowflake(雪花算法) - C#版

概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的.有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成.而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移到Cassandra,因为Cassandra没有顺序ID生成机制,所以开发了这样一套全局唯一ID生成服务. 该项目地址为:https://github.co

高并发之 - 全局有序唯一id Snowflake 应用实战

前言 本篇主要介绍高并发算法Snowflake是怎么应用到实战项目中的. 对于怎么理解Snowflake算法,大家可以从网上搜索'Snowflake',大量资源可供查看,这里就不一一详诉,这里主要介绍怎么实战应用. 对于不理解的,可以看看这篇文章  Twitter-Snowflake,64位自增ID算法详解 为什么有Snowflake算法的出现呢? 首先它是Twitter提出来的. 前世今生 以前我们可以用UUID作为唯一标识,但是UUID是无序的,又是英文.数字.横杆的结合.当我们要生成有序的

snowflake算法

1.snowflake算法ID生成器介绍 snowflake 是 twitter 开源的一个分布式ID 生成器 2.为什么使用snowflake (1) 主键自增弊端:不是全局id,当多表合并.构建数据仓库.进行数据分析.会导致主键冲突 (2) uuid或guid弊端:数据量过大 (3)全局redis生成弊端:内存开销大.网络开销大 (4)snowflake解决上述问题.效率高.经测试每秒可产生26万个id 3.生成原理 (1)采用64位二进制数结构 (2)第1位不用,保留 (3)后41位为时间