`

Twitter snowFlake

    博客分类:
  • java
 
阅读更多
package com.netty.test.netty4.tool;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class IdWorker {

	protected static final Logger LOG = LoggerFactory.getLogger(IdWorker.class);

	private long workerId;
	private long datacenterId;
	private long sequence = 0L;

	private long twepoch = 1288834974657L;

	private long workerIdBits = 5L;
	private long datacenterIdBits = 5L;
	private long maxWorkerId = -1L ^ (-1L << workerIdBits);
	private long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
	private long sequenceBits = 12L;

	private long workerIdShift = sequenceBits;
	private long datacenterIdShift = sequenceBits + workerIdBits;
	private long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
	private long sequenceMask = -1L ^ (-1L << sequenceBits);

	private long lastTimestamp = -1L;

	public IdWorker(long workerId, long datacenterId) {
		// sanity check for workerId
		if (workerId > maxWorkerId || workerId < 0) {
			throw new IllegalArgumentException(
					String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
		}
		if (datacenterId > maxDatacenterId || datacenterId < 0) {
			throw new IllegalArgumentException(
					String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
		}
		this.workerId = workerId;
		this.datacenterId = datacenterId;
		LOG.info(String.format(
				"worker starting. timestamp left shift %d, datacenter id bits %d, worker id bits %d, sequence bits %d, workerid %d",
				timestampLeftShift, datacenterIdBits, workerIdBits, sequenceBits, workerId));
	}

	public synchronized long nextId() {
		long timestamp = timeGen();

		if (timestamp < lastTimestamp) {
			LOG.error(String.format("clock is moving backwards.  Rejecting requests until %d.", lastTimestamp));
			throw new RuntimeException(String.format(
					"Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
		}

		if (lastTimestamp == timestamp) {
			sequence = (sequence + 1) & sequenceMask;
			if (sequence == 0) {
				timestamp = tilNextMillis(lastTimestamp);
			}
		} else {
			sequence = 0L;
		}

		lastTimestamp = timestamp;

		return ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift)
				| (workerId << workerIdShift) | sequence;
	}

	protected long tilNextMillis(long lastTimestamp) {
		long timestamp = timeGen();
		while (timestamp <= lastTimestamp) {
			timestamp = timeGen();
		}
		return timestamp;
	}

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

}
分享到:
评论

相关推荐

    Twitter Snowflake C#版源码

    Twitter的Snowflake是一种分布式ID生成算法,用于在大规模分布式系统中生成全局唯一的、有序的64位整数ID。这个算法由Twitter开源,解决了在分布式环境下如何生成具有时间序列属性且不重复的ID的问题。现在,我们将...

    Twitter的 Snowflake 推特雪花算法JAVA实现方案

    Twitter的 Snowflake 推特雪花算法JAVA实现方案,用于自动生成id

    Twitter的分布式自增ID算法Snowflake的PHP实现,Snowflake PHP版本,高并发唯一id,全局唯一id,不重复id

    Twitter Snowflake算法,php版代码; 请见博客: http://blog.csdn.net/envon123/article/details/52953872

    Twitter_Snowflake

    Twitter_Snowflake,SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。

    Laravel开发-laravel-snowflake .zip

    laravel-snowflake就是Laravel对这个算法的实现,它能够生成类似于Twitter Snowflake的64位ID,这些ID由时间戳、工作节点ID和序列号三部分组成,确保了全局唯一性。 1. **雪花算法(Snowflake)详解** - **时间戳*...

    cpp-基于TwitterSnowflake的ID生成作为redis模块

    Twitter Snowflake算法是一种广泛使用的ID生成方案,其设计思路巧妙,能有效地解决高并发环境下的ID生成问题。这个项目将Twitter Snowflake算法集成到了Redis模块中,使得ID生成服务更加高效和便捷。 **Twitter ...

    开源项目-bwmarrin-snowflake.zip

    开源项目-bwmarrin-snowflake.zip,bwmarrin/snowflake - A very simple package to generate or parse Twitter snowflake IDs

    Go-一个实现TwitterSnowFlake算法的Go分布式UID生成器

    描述中的"一个实现Twitter SnowFlake算法的Go分布式UID生成器"进一步确认了该程序的功能,即它是一个基于Twitter SnowFlake算法的 UID 生成器,而且是用Go语言编写的,这表明它可能具有良好的性能和并发处理能力,...

    dedid全局唯一 ID(主键)生成器

    描述中提到,“本算法的实现参考了Twitter Snowflake”,这意味着dedid生成器使用了类似于Twitter Snowflake的策略。Snowflake算法是一种基于时间戳、工作节点ID和序列号的分布式ID生成方案,确保在分布式环境中产生...

    PHP唯一ID生成扩展Atom.zip

    使用Twitter的 Snowflake算法,有兴趣可以了解一下这个算法: https://github.com/twitter/snowflake  php.ini的配置项: [ukey] ukey.datacenter = integer ukey.worker = integer ukey.twepoch = uint64...

    Go-twittersnowFlake算法的golang实现

    twitter snowFlake 算法的golang实现

    Laravel开发-laraflake

    为了解决这个问题,Twitter提出了一个叫做“Snowflake”的ID生成算法,它能够生成全局唯一的64位ID。而"Laravel开发-laraflake"正是基于Twitter的Snowflake算法为Laravel框架提供的一种扩展包。 首先,让我们了解...

    Snowflake算法java代码

    Twitter-Snowflake算法,java代码实现,采用默认配置,单例单机模式

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

    【Java实现Twitter的分布式自增ID算法snowflake】 在分布式系统设计中,生成全局唯一ID是一个常见的需求。Twitter的Snowflake算法就是为了解决这个问题而诞生的,它提供了一种高效、有序且不会冲突的ID生成策略。...

    Laravel开发-laravel-snowflake

    `laravel-snowflake` 是一个专门为 Laravel 设计的扩展包,它引入了 Twitter 的 Snowflake ID 生成算法,旨在为 Laravel 应用提供高效且具有时间序列性质的全局唯一 ID。 **1. Snowflake 算法介绍** Snowflake 算法...

    Java项目学习笔记: SSM实战项目-Java高并发秒杀API,详细流程+学习笔记

    可以采用Snowflake算法或者分布式ID服务如Twitter的Twitter Snowflake,阿里云的UUidGenerator等。 8. **负载均衡与集群**:为了处理大量并发请求,应用需要部署在多台服务器上形成集群,通过负载均衡器(如Nginx)...

    snowflake-C语言实现分布式自增有序的唯一ID生成算法

    We have retired the initial release of Snowflake and working on open sourcing the next version based on Twitter-server, in a form that can run anywhere without requiring Twitter's own infrastructure ...

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

    Twitter开源的Snowflake算法是一种常用的分布式ID生成策略,它将ID分为三部分:时间戳(41位)、工作机器ID(10位)和序列号(12位)。通过这种方式,可以保证ID的全局唯一性,并且有序。 #### 3.2 UUID UUID...

    全局自增ID设计方案

    ##### Twitter Snowflake方案 Twitter在迁移存储系统时面临类似的问题,于是开发了Snowflake系统。Snowflake的核心特点在于其高度可扩展性和高性能。 1. **ID结构**:生成64位的ID,分为三个部分:41位的时间戳...

Global site tag (gtag.js) - Google Analytics