欢迎 :-)
既然搜到“雪花算法”的概念,相信对“python-UUID”库已经有所了解,不妨回忆一下,
点击这里:https://www.cnblogs.com/hellojesson/p/6410445.html
本章内容:
1. 什么是雪花算法
2. 雪花算法原理
3. 优秀的python库:pysnowflake
4. 其他团队生成guid方案
********************************************
0. 场景描述:
近期项目中,清洗数据时,由于数据量比较大(千万级),入库时,不打算用数据库自增ID作为某条记录的“唯一ID”,用UUID担心会有重复,于是开始寻找UUID的替代方案,了解到比较出名的“雪花算法”生成guid(全局唯一ID),发现有优秀的前辈已经替我们做了铺垫 ---pysnowflake 就是它!
1. 什么是雪花算法
snowflake中文意思: 雪花,雪片,可以联想到下雪的时候,漫天雪花飞舞,意境之美,雪景无边无垠,自然界没有两片完全相同的雪花,可想作者对该算法给予的信心和希望。好在snowflake出身正统,生于twitter,在团队牛人的维护下,不断完善迭代,被广泛使用。雪花算法的原始版本是scala版,感兴趣的小伙伴可以了解下。
产生背景:twitter高并发环境下对唯一ID生成的需求。
雪花算法有如下特点:
该算法,属于半依赖数据源方式,原理是使用Long类型(64位),按照一定的规则进行填充:时间(毫秒级)+集群ID+机器ID+序列号,每部分占用的位数可以根据实际需要分配,其中集群ID和机器ID这两部分,在实际应用场景中要依赖外部参数配置或数据库记录。
--- 优点:高性能、低延迟、按时间有序、生成效率极高 --- 缺点:要求机器时钟同步(到秒级即可) --- 适用场景:分布式应用环境的数据主键
顺便对比下:自增ID和一般GUID
--- 自增ID:对于数据敏感场景不宜使用,且不适合于分布式场景。 --- GUID:采用无意义字符串,数据量增大时造成访问过慢,且不宜排序。
2. 雪花算法原理
算法描述:
--- 最高位1bit是符号位,始终为0,不可用。 --- 41位的时间序列,精确到毫秒级,41位的长度可以使用69年。时间位还有一个很重要的作用是可以根据时间进行排序。 --- 10位的机器标识,10位的长度最多支持部署1024个节点。 --- 12位的计数序列号,序列号即一系列的自增id,可以支持同一节点同一毫秒生成多个ID序号,12位的计数序列号支持每个节点每毫秒产生4096个ID序号。
3. 优秀的python库:pysnowflake
安装 pysnowflake
pip install pysnowflake
启动pysnowflake ---pysnowflake基于Tornado开发,启动时相当于一个服务
snowflake_start_server --address=192.168.1.1 --port=8910 --dc=1 --worker=1 --log_file_prefix=/tmp/pysnowflask.log
参数说明:可以通过--help查看
---address:本机的IP地址默认localhost ---dc:数据中心唯一标识符默认为0 ---worker:工作者唯一标识符默认为0 ---log_file_prefix:日志文件所在位置
Mac环境启动:---不加任何参数,直接就启动了
snowflake_start_server
CentOS下普通启动:
snowflake_start_server --address=127.0.0.1 --port=8910
如果需要后台运行,参考:
nohup snowflake_start_server --address=127.0.0.1 --port=8910 --dc=1 --worker=1 --log_file_prefix=/tmp/pysnowflask.log>/dev/null &
使用样例:
# 样例:4361106750091296769 import snowflake.client def get_snowflake_uuid(): guid = snowflake.client.get_guid() return guid get_snowflake_uuid()
4. 其他团队生成guid方案
--- 百度uid-generator: https://gitee.com/mirrors/UidGenerator https://github.com/baidu/uid-generator https://blog.csdn.net/Jacksun_huang/article/details/99948429 --- Leaf—美团点评分布式ID生成系统: https://tech.meituan.com/2019/03/07/open-source-project-leaf.html https://tech.meituan.com/2017/04/21/mt-leaf.html --- 雪花算法SpringBoot版 https://gitee.com/darkranger/id-generator --- 推荐基于python实现: https://www.cnblogs.com/oklizz/p/11865750.html --- 其他: https://www.jianshu.com/p/1271babe6b08
参考:https://www.cnblogs.com/galengao/p/5780519.html