先看引文:
http://www.tuicool.com/articles/F7veqq
原文的部分:
Snowflake是twitter开源的一款独立的适用于分布式环境的ID生成服务器。
前41bits是以微秒为单位的timestamp。
接着10bits是事先配置好的机器ID。
最后12bits是累加计数器。
我的类似实现思路(不完全和上面的要求一样的):
package com.gym.core.common;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.commons.lang.StringUtils;
import com.gym.core.date.DateContants.DateFormatType;
import com.gym.core.date.DateParseUtils;
/**
*
* @author wangxinchun1988@163.com
* @date 2016-3-5 下午3:04:41
*/
public class SequenceIdGenerateUtils {
private static final long BEGIN_DATE = DateParseUtils.convertDate("2016-01-01", DateFormatType.YYYY_MM_DD).getTime();
private static final int localMachineAppend = Integer.parseInt(DnsUtil.getHostAddress().split("\\.")[3]);
private static AtomicInteger atomicInteger = new AtomicInteger(0);
public static long generate(int businessType){
StringBuilder binaryStr = new StringBuilder("0");
binaryStr.append(wrapTimeBinaryStr());
binaryStr.append(wrapBusinessBinaryStr(businessType));
binaryStr.append(wrapRoomBinaryStr(1));
binaryStr.append(wrapMachineBinaryStr(localMachineAppend));
binaryStr.append(wrapSequencePeyMachine());
return Long.parseLong(binaryStr.toString(), 2);
}
/**
* 39 bit */
private static String wrapTimeBinaryStr(){
long currentTime = System.currentTimeMillis();
long timeElipse = currentTime - BEGIN_DATE;
return StringUtils.leftPad(Long.toBinaryString(timeElipse),39,'0');
}
/**
* 10 bit
*/
private static String wrapMachineBinaryStr(int machineIp){
return StringUtils.leftPad(Integer.toBinaryString(machineIp), 10, '0');
}
/**
* 5 bit
*/
private static String wrapBusinessBinaryStr(int businessType){
return StringUtils.leftPad(Integer.toBinaryString(businessType), 5, '0');
}
/**
* 4 bit
*/
private static String wrapRoomBinaryStr(int room){
return StringUtils.leftPad(Integer.toBinaryString(room), 4, '0');
}
/**
* 5 bit
*/
private static String wrapSequencePeyMachine(){
if(atomicInteger.get() == Integer.MAX_VALUE){
atomicInteger = new AtomicInteger();
}
return StringUtils.leftPad(Integer.toBinaryString(atomicInteger.incrementAndGet() % 32), 5,'0');
}
}
分享到:
相关推荐
Snowflake算法是由Twitter开源的一种高效且可扩展的分布式ID生成方案,广泛应用于Java和其他编程语言的系统中。 Snowflake算法的核心思想是将64位的整数划分为不同的部分,分别为: 1. **时间戳**(41位):自定义...
为了更清晰地展示分布式ID生成的具体实现方式,以下列举了几种典型的方法。 ##### 4.1 数据库自增ID 利用数据库提供的自增功能是一种简单有效的解决方案。例如,MySQL提供了`AUTO_INCREMENT`属性,可以自动为表中...
结合上述信息,"idGenerate"这个文件很可能是包含了一个Java实现的分布式代码生成器项目,可能包含了Snowflake算法或者其他分布式ID生成策略的源代码。通过学习和理解这些代码,我们可以更好地掌握在Java环境中如何...
总结,选择哪种分布式ID生成方法取决于业务场景的具体需求,如系统的并发量、趋势有序性的要求、可用性和扩展性等。常见的方法各有优劣,可以根据实际情况权衡选择。例如,如果对ID趋势有序性要求较高,可以考虑使用...
本篇文章将详细探讨如何使用Go和MySQL来实现一个分布式ID生成服务。 ### 1. 分布式ID的重要性 在大规模分布式系统中,为了保证数据的一致性和避免冲突,每个新生成的ID必须是全局唯一的。传统的递增ID在多节点环境...
《深入理解百度开源的分布式ID生成器UidGenerator》 在分布式系统中,生成全局唯一ID是一个常见的需求,而百度开源的UidGenerator就是这样一款强大的工具。它基于Snowflake模型,为系统提供了高性能且具有唯一性的...
Vesta,uidgennator等分布式id生成方案 UidGenerator是Java实现的, 基于Snowflake算法的唯一ID生成器。UidGenerator以组件形式工作在应用项目中, 支持自定义workerId位数和初始化策略, 从而适用于docker等虚拟化环境...
在提供的压缩包文件中,"分布式ID生成策略(1)_snowflake算法.pdf"可能是详细讲解Snowflake算法的文档,可以进一步学习了解其原理和实现细节。其他如".classpath"、".gitignore"、".project"、"pom.xml"等文件是Java...
分布式ID生成是现代互联网系统中不可或缺的一个环节,它在各种业务场景中起到标识唯一对象的作用。为了满足分布式环境的需求,生成的ID需要具备以下几个关键特性: 1. 唯一性:确保每个ID在全球范围内都是独一无二...
本文将深入探讨“通用、灵活、高性能”的分布式ID生成器的设计原理、实现方式以及它在服务器应用和分布式服务/框架中的应用。 首先,让我们理解什么是分布式ID。在传统的单体应用中,我们可以通过自增ID或者数据库...
综上所述,Twitter的雪花算法(Snowflake)提供了一种高效、简单的分布式ID生成方案,通过合理的结构设计,确保了全局唯一性和顺序性。在Java环境下,可以通过实现相应的类和方法轻松地引入这一机制,为分布式系统的...
时间戳必须大于上一次生成ID的时间戳. 如果和上次生成时间不同,重置sequence,就是下一毫秒开始,sequence计数重新从0开始累加, 为了保证尾数随机性更大一些,最后一位可以设置一个随机数 防止产生的时间比之前的...
美团的双buffer分布式ID生成系统基于Twitter的Snowflake算法进行改良,核心思想是将ID分为多个部分,如时间戳、工作机器ID和序列号。双buffer的设计主要是为了提高系统的稳定性和可用性,具体如下: 1. **时间戳**...
迄今为止最全面的分布式主键ID生成器。 优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 PHP 扩展及 ...
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 ...
分布式ID生成,雪花算法生成唯一ID工具类。该工具类线程安全。 整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右
为了应对这一挑战,出现了多种分布式ID生成方案,其中一种名为SnowflakeX的改进型分布式ID生成器以其卓越的性能和可靠性脱颖而出。 ### ID生成器的必要性 在分布式系统中,尤其是数据存储实现水平拆分的情况下,...
分布式ID生成器是大型互联网系统中不可或缺的一部分,其主要任务是为系统中的各种实体生成全局唯一的标识符(ID)。在复杂分布式环境下,选择合适的ID生成策略对于系统的性能、可用性和可扩展性至关重要。以下是几种...
针对以上几种方法存在的问题,可以借鉴Twitter的Snowflake算法思想,结合具体的业务场景和并发量需求,设计出适用于特定环境的分布式ID生成方案。Snowflake算法的核心思路是: - **时间戳**:占41位,用来表示ID...