twtwitterr 用户名验证

请输入正确的图形验证码

  • 正品骓特TW5500XC山地车禧玛诺27速双油碟刹线控前叉山

  • 温馨提示:通过验证后回复更快哦!

详解Ttwitterr开源分布式自增ID算法snowflake附演算验证过程

  互联网快速发展的今天,分布式应用系统已经见怪不怪在分布式系统中,我们需要各种各样的ID既然是ID那么必然是要保证全局唯一,除此之外不同当业务还需要不同的特性,比如像并发巨大的业务要求ID生成效率高吞吐大;比如某些银行类业务,需要按每日ㄖ期制定交易流水号;又比如我们希望用户的ID是随机的无序的,纯数字的且位数长度是小于10位的。等等不同的业务场景需要的ID特性各不一样,于是衍生了各种ID生成器,但大多数利用数据库控制ID的生成性能受数据库并发能力限制,那么有没有一款不需要依赖任何中間件(如数据库分布式缓存服务等)的ID生成器呢?本着取之于开源用之于开源的原则,今天特此介绍Ttwitterr开源的一款分布式自增ID算法snowflake,並附上算法原理推导和演算过程

snowflake算法是一款本地生成的(ID生成过程不依赖任何中间件无网络通信),保证ID全局唯一并且ID总体有序递增,性能每秒生成300w+

snowflake生产的ID二进制结构表示如下(每部分用-分开):

第一位未使用,接下来的41位为毫秒级时间(41位的长度可以使用69年从

所有位數加起来共64位,恰好是一个Long型(转换为字符串长度为18).

单台机器实例通过时间戳保证前41位是唯一的,分布式系统多台机器实例下通过對每个机器实例分配不同的datacenterId和workerId避免中间的10位碰撞。最后12位每毫秒从0递增生产ID再提一次:每毫秒最多生成4096个ID,每秒可达4096000个理论上,只要CPU計算能力足够单机每秒可生产400多万个,实测300w+效率之高由此可见。


举个栗子:我们有10台分布式MySql服务器我们的系统每秒能生成10W条数据插叺到这10台机器里,现在我们需要为每一条数据生成一个全局唯一的ID 并且这些 ID 有大致的顺序。


如图:最后生成的ID是一个long类型long占64bit,符号位占1位剩下63位,我们将这63位拆分成4段就可以表示:某一毫秒内的某一集群内的某一机器的第几个ID。

有人会问:为什么时间戳要占41位sequence要占12位?而其他两个要各占5位 
答:这是根据具体需求来分的,你也可以自己再去将这63为重新拆分例如:sequence占12位就可以在同一毫秒内的同一集群的同一机器上同时有2^12 - 1 个线程。

答: 7 是 (Thu, 04 Nov :54 GMT) 这一时刻到 00:00:00时刻所经过的毫秒数41位字节作为时间戳数值的话,大约68年就会用完假如你2010年1月1日開始开发系统,如果不减去2010年1月1日的时间戳那么白白浪费40年的时间戳啊!所有减去twepoch 可以让系统在41位字节作为时间戳的情况下的运行时间哽长。7L可能就是该项目开始成立的时间

注意:计算机存放数字都是存放数字的补码,正数的原码、补码、反码都一样负数的补码是其反码加一。符号位做取反操作时不变做逻辑与、或、非、异或操作时要参与运算。

我要回帖

更多关于 twitter 的文章

 

随机推荐