zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    一手遮天 Android
    一手遮天 Android
    一手遮天 Android
    一手遮天 Android
    一手遮天 Android
    springcloud-gateway整合Swagger聚合微服务系统API文档
    Gateway 其他配置
    Gateway Global Filters
    Gateway GatewayFilter Factories
    Gateway Route Predicate Factories
  • 原文地址:https://www.cnblogs.com/hellojesson/p/12942757.html
Copyright © 2011-2022 走看看