python开发笔记 -- python基于“雪花算法”guid生成库

欢迎 :-)

     既然搜到“雪花算法”的概念,相信对“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

 

posted @ 2020-05-23 15:37  hello-Jesson  阅读(9355)  评论(0编辑  收藏  举报