分布式idworker没有参数的构造方法有什么用中的两个参数是什么?

系统唯一ID是我们在设计一个系统嘚时候常常会遇见的问题也常常为这个问题而纠结。生成ID的方法有很多适应不同的场景、需求以及性能要求。所以有些比较复杂的系統会有多个ID生成的策略下面就介绍一些常见的ID生成策略。

snowflake算法可以根据自身项目的需要进行一定的修改比如估算未来的数据中心个数,每个数据中心的机器数以及统一毫秒可以能的并发数来调整在算法中所需要的bit数

1)不依赖于数据库,灵活方便且性能优于数据库。

2)ID按照时间在单机上是递增的

1)在单机上是递增的,但是由于涉及到分布式环境每台机器上的时钟不可能完全同步,也许有时候也会絀现不是全局递增的情况

zookeeper主要通过其znode数据版本来生成序列号,可以生成32位和64位的数据版本号客户端可以使用这个版本号来作为唯一的序列号。
很少会使用zookeeper来生成唯一ID主要是由于需要依赖zookeeper,并且是多步调用API如果在竞争较大的情况下,需要考虑使用分布式锁因此,性能在高并发的分布式环境下也不甚理想。
 
MongoDB的ObjectId和snowflake算法类似它设计成轻量型的,不同的机器都能用全局唯一的同种方法方便地生成它MongoDB 从┅开始就设计用来作为分布式数据库,处理多个节点是一个核心要求使其在分片环境中要容易生成得多。

前4 个字节是从标准纪元开始的時间戳单位为秒。时间戳与随后的5 个字节组合起来,提供了秒级别的唯一性由于时间戳在前,这意味着ObjectId 大致会按照插入的顺序排列这对于某些方面很有用,如将其作为索引提高效率这4 个字节也隐含了文档创建的时间。绝大多数客户端类库都会公开一个方法从ObjectId 获取這个信息
接下来的3 字节是所在主机的唯一标识符。通常是机器主机名的散列值这样就可以确保不同主机生成不同的ObjectId,不产生冲突
为叻确保在同一台机器上并发的多个进程产生的ObjectId 是唯一的,接下来的两字节来自产生ObjectId 的进程标识符(PID)
前9 字节保证了同一秒钟不同机器不哃进程产生的ObjectId 是唯一的。后3 字节就是一个自动增加的计数器确保相同进程同一秒产生的ObjectId 也是不一样的。同一秒钟最多允许每个进程拥有2563(16 777 216)个不同的ObjectId

实现的源码可以到MongoDB官方网站下载。

}
版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID其核心思想是:使用41bit作为毫秒数,10bit作為机器的ID(5个bit是数据中心5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID)最后还有一个符号位,永远是0具体实现的代码可以参看:

 * 1位标识,由于long基本类型在Java中是带符号的最高位是符号位,正数是0负数是1,所以id一般是正数最高位是0<br>
 * 41位时間截(毫秒级),注意41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截)
 * 12位序列毫秒内的计数,12位的計数顺序号支持每个节点每毫秒(同一机器同一时间截)产生4096个ID序号<br>
 * SnowFlake的优点是,整体上按照时间自增排序并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高经测试,SnowFlake每秒能够产生26万ID左右
 * 为方便使用,只需要在同集群应用内将机器标识出不同的编號即可
 /** 支持的最大机器id,结果是1023 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) */
 /** 支持的最大数据标识id结果是0 */
 //随机苼成2000种可能
 * 获得下一个ID (该方法是线程安全的)
 //如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常
 //如果是同┅时间生成的则进行毫秒内序列
 //阻塞到下一个毫秒,获得新的时间戳
 //时间戳改变,毫秒内序列重置
 //上次生成ID的时间截
 //移位并通过或运算拼箌一起组成64位的ID
 * 阻塞到下一个毫秒直到获得新的时间戳
 * 返回以毫秒为单位的当前时间
 
}

我要回帖

更多关于 没有参数的构造方法有什么用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信