网站建设相对路径,上海闵行区网站制作公司,wordpress乐器模版,网站做app的软件有哪些snowflake中文的意思是 雪花#xff0c;雪片#xff0c;所以翻译成雪花算法。它最早是twitter内部使用的分布式环境下的唯一ID生成算法。在2014年开源。雪花算法产生的背景当然是twitter高并发环境下对唯一ID生成的需求#xff0c;得益于twitter内部高超的技术#xff0c;雪…snowflake中文的意思是 雪花雪片所以翻译成雪花算法。它最早是twitter内部使用的分布式环境下的唯一ID生成算法。在2014年开源。雪花算法产生的背景当然是twitter高并发环境下对唯一ID生成的需求得益于twitter内部高超的技术雪花算法流传至今并被广泛使用。它至少有如下几个特点能满足高并发分布式系统环境下ID不重复基于时间戳可以保证基本有序递增有些业务场景对这个又要求不依赖第三方的库或者中间件生成效率极高雪花算法原理10位的数据机器位所以可以部署在1024个节点。12位的序列在毫秒的时间戳内计数。支持每个节点每毫秒产生4096个ID序号所以最大可以支持单节点大概四百万的并发量这个妥妥的够用了。雪花算法java实现public class SnowflakeIdWorker {/** 开始时间截 (这个用自己业务系统上线的时间) */private final long twepoch 1575365018000L;/** 机器id所占的位数 */private final long workerIdBits 10L;/** 支持的最大机器id结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) */private final long maxWorkerId -1L ^ (-1L workerIdBits);/** 序列在id中占的位数 */private final long sequenceBits 12L;/** 机器ID向左移12位 */private final long workerIdShift sequenceBits;/** 时间截向左移22位(1012) */private final long timestampLeftShift sequenceBits workerIdBits;/** 生成序列的掩码这里为4095 (0b1111111111110xfff4095) */private final long sequenceMask -1L ^ (-1L sequenceBits);/** 工作机器ID(0~1024) */private long workerId;/** 毫秒内序列(0~4095) */private long sequence 0L;/** 上次生成ID的时间截 */private long lastTimestamp -1L;//Constructors/*** 构造函数* param workerId 工作ID (0~1024)*/public SnowflakeIdWorker(long workerId) {if (workerId maxWorkerId || workerId 0) {throw new IllegalArgumentException(String.format(workerId cant be greater than %d or less than 0, maxWorkerId));}this.workerId workerId;}// Methods/*** 获得下一个ID (该方法是线程安全的)* return SnowflakeId*/public synchronized long nextId() {long timestamp timeGen();//如果当前时间小于上一次ID生成的时间戳说明系统时钟回退过这个时候应当抛出异常if (timestamp 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;}//上次生成ID的时间截lastTimestamp timestamp;//移位并通过或运算拼到一起组成64位的IDreturn ((timestamp - twepoch) timestampLeftShift) //| (workerId workerIdShift) //| sequence;}/*** 阻塞到下一个毫秒直到获得新的时间戳* param lastTimestamp 上次生成ID的时间截* return 当前时间戳*/protected long tilNextMillis(long lastTimestamp) {long timestamp timeGen();while (timestamp lastTimestamp) {timestamp timeGen();}return timestamp;}/*** 返回以毫秒为单位的当前时间* return 当前时间(毫秒)*/protected long timeGen() {return System.currentTimeMillis();}
}上面第一部分说到雪花算法的性能比较高接下来我们测试下性能public static void main(String[] args) {SnowflakeIdWorker idWorker new SnowflakeIdWorker(1);long start System.currentTimeMillis();int count 0;for (int i 0; System.currentTimeMillis()-start1000; i,counti) {idWorker.nextId();}long end System.currentTimeMillis()-start;System.out.println(end);System.out.println(count);}其可以产生400w的id效率还是相当高的。调整比特位分布很多公司会根据 snowflake 算法根据自己的业务做二次改造。举个例子。你们公司的业务评估不需要运行69年可能10年就够了。但是集群的节点可能会超过1024个这种情况下你就可以把时间戳调整成39bit然后workerid调整为12比特。同时workerid也可以拆分下比如根据业务拆分或者根据机房拆分等。类似如下源码twitter的雪花算法https://github.com/twitter-archive/snowflake