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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM