暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一文了解雪花算法|snowflake

无限递归 2021-10-20
2841

写在前面

    欢迎各位小伙伴对日记的布局、日记的内容等各个方面提出宝贵的意见和建议,我将会在能力范围内尽量完善哟
    同时也欢迎各位小伙伴批评指正日记中记录不正确的地方,以帮助其他小伙伴获得正确知识----赠人玫瑰,手有余香。












分布式唯一ID的要求

  • 全局唯一性(must)

  • 趋势递增(must)

  • 单调递增(should)

  • 安全(无规律可循)(should)

twitter雪花算法原理

雪花算法使用一个64位的整数来表示一个唯一ID

这64bits如图被分成了5个部分:

  • 1bit 作为符号位,总是为0

  • 41bits 用来存储毫秒时间戳,计算后可知约可用69年

  • 5bits 用来存储数据中心ID,最多可以表示32个数据中心

  • 5bits 用来存储工作机器ID,最多可以表示32台工作机器

  • 12bits 用来在同节点时间相同时作为自增ID标识唯一性,同1ms可以表示最多4096个ID,所以理论上1s内可以生成约409W个ID

注意:数据中心ID+工作机器ID可以唯一确定一个节点,最多可以表示1024个节点

twitter雪花算法的优缺点

根据雪花算法的原理,我们可以很清楚的看出雪花算法有哪些优缺点

优点:

  • 无依赖(Redis、DB等)

  • 秒级别生成百万级ID,速度够快

  • 生成的ID是趋势递增的,有利于提升MySQL数据库的插入效率

缺点:

  • 强依赖时间,时钟回拨会导致生成重复ID

  • 1024节点数不一定够用

  • 机器ID分配后无法自动回收,重新使用

非一成不变

雪花算法并不是一成不变的,业务可以根据自身需求,对雪花算法进行变种开发,进而定制出符合自身业务需求的雪花算法。

比如:5bits
数据中心ID, 5bits
工作机器ID,你可以拆分成 3bits
数据中心ID, 7bits
工作机器ID,这样机器ID就可以多一些,数据中心ID就会少一些。

再比如:你觉得 41bits
的太多了,可能你们用不了那么些年,就可以分几bits出来用来干别的事情。

开源分布式ID框架

以下两个框架分别以不同方式在不同程度上解决了twitter雪花算法的缺点,感兴趣的小伙伴可自行到github中进行研习。

  1. 百度的UIDGenerator:https://github.com/baidu/uid-generator

  2. 美团的Leaf:https://github.com/Meituan-Dianping/Leaf



扫码关注更多精彩


往期推荐



一文读懂Linux下的网络IO模型

Redis布隆过滤器|Redis Bloom


文章转载自无限递归,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论