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