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()); } }
相关推荐
在Java中实现Snowflake算法,一般会创建一个ID生成器类,包含以下关键步骤: 1. **初始化**: 设置起始时间戳和工作节点ID,这些值通常在系统启动时配置。 2. **ID生成**: 获取当前毫秒数,与起始时间戳相减得到...
结合上述信息,"idGenerate"这个文件很可能是包含了一个Java实现的分布式代码生成器项目,可能包含了Snowflake算法或者其他分布式ID生成策略的源代码。通过学习和理解这些代码,我们可以更好地掌握在Java环境中如何...
为了应对这一挑战,出现了多种分布式ID生成方案,其中一种名为SnowflakeX的改进型分布式ID生成器以其卓越的性能和可靠性脱颖而出。 ### ID生成器的必要性 在分布式系统中,尤其是数据存储实现水平拆分的情况下,...
分布式ID生成器是大型互联网系统中不可或缺的一部分,其主要任务是为系统中的各种实体生成全局唯一的标识符(ID)。在复杂分布式环境下,选择合适的ID生成策略对于系统的性能、可用性和可扩展性至关重要。以下是几种...
在Java开发中,生成分布式唯一ID是常见的需求,特别是在大数据量和高并发的场景下,保证每个记录的ID独特性至关重要。雪花ID(Snowflake ID)是一种被广泛采用的解决方案,由Twitter开源,其设计目标就是生成全局...
雪花算法分布式ID生成器 该项目的目的是提供一个轻量级、高并发、高可用的生成唯一ID的服务,生成的ID是一个64位的 长整型,全局唯一,保持递增,相对有序。基于twitter的雪花算法来生成ID,用于取代UUID那种无序、...
在设计分布式ID生成器之前,我们需要明确几个关键需求: 1. **全局唯一**:生成的ID在整个系统中必须是唯一的,即使是在分布式环境中也需满足这一条件。 2. **趋势有序**:虽然不要求ID绝对递增,但希望它们能够在...
徐海峰在其讲解中展示了Id生成器在实际应用中需要考虑的需求和挑战,并提出了多种策略和架构设计,以应对分布式系统环境下对Id生成器的高要求。通过这些方法的合理运用,可以极大地提升分布式数据库的性能和可靠性,...
- ID生成器模块:负责与MySQL交互,获取新的ID。 - 请求处理器模块:接收来自客户端的请求,使用goroutine进行异步处理。 - 锁管理模块:实现分布式锁,防止ID分配冲突。 - 客户端接口:提供给其他系统调用的API接口...
常见的ID生成策略有雪花算法、UUID、Twitter的Snowflake算法等。这些算法通常结合时间戳、节点标识和序列号,确保在全球范围内的分布式系统中生成的ID都是独一无二的。 从压缩包子文件的文件名称列表来看,"client...
因此,引入专门的分布式ID生成器解决方案成为必要。 ### UUID方案 UUID(Universally Unique Identifier)是一种常见的生成全局唯一ID的方法,但它存在一些问题: 1. **存储不便**:UUID由16字节的128位组成,通常...
ID生成器在应用程序中,经常需要全局唯一的ID作为数据库主键。如何生成全局唯一ID?首先,需要确定全局唯一ID是整型还是字符串?如果是字符串,那么现有的UUID就完全满足需求,不需要额外的工作。 SnowFlake算法...
为了解决这个问题,可以使用锁机制或者分布式ID生成服务(如Twitter的Snowflake或Google的UUID)来确保全局唯一性。 除了卡号生成,密码的安全性也是`卡号密码批量生成器Smile`需要关注的重点。通常,密码生成会...
在这个名为"Distributed-Kit"的压缩包中,我们找到了三个关键组件:分布式锁、ID生成器和限流工具。下面将详细解释这三个组件及其在分布式环境中的应用。 **分布式锁** 分布式锁是一种在分布式系统中实现同步控制的...
分布式序列号生成器如Twitter的Snowflake或者Facebook的V4 UUID,可以生成全局唯一的、有序的序列号。这些系统通常基于时间戳、工作节点ID和序列号进行组合,确保在分布式环境中的唯一性,同时保证生成序列号的顺序...
另一种流行的分布式ID生成器是MongoDB的ObjectID。每个ObjectID包含时间戳、机器标识、进程标识和随机数,同样能保证全局唯一性,且长度较短,适合数据库存储。 除了上述方案,还有一些基于特定硬件(如GPU或TPU)...
- **分布式ID生成**:Snowflake、UUID、Twitter的Twitter Snowflake、以及基于数据库的自增ID。 - **分布式缓存**:Redis、Memcached的使用场景与操作,以及缓存穿透、缓存雪崩、缓存击穿问题的解决方案。 以上是...
18. 分布式ID生成:可使用雪花算法、UUID、MongoDB自增ID、Twitter的Snowflake或分布式ID生成服务如Seq。 19. 分布式事务解决方案:两阶段提交、三阶段提交、Saga、分布式事务协调器(如X/Open XA)等。 20. 大...
- **分布式ID生成**:如Snowflake算法、UUID等。 - **分布式锁**:解决分布式环境下的一致性问题。 这个压缩包中的"JAVA核心知识点整理.pdf"文件应该包含了以上所有领域的详细讲解和实例,对于Java开发者来说是一...
- 分布式ID生成:了解Snowflake算法、UUID等ID生成策略。 - 微服务:研究Docker、Kubernetes等容器化和编排技术。 以上知识点只是冰山一角,Java互联网企业面试真题可能还包括其他领域,如网络编程、大数据处理、...