当前位置: 首页 > 工具软件 > iD > 使用案例 >

python生成唯一id,分布式唯一id,雪花算法

谢旻
2023-12-01

关于toollib

什么是唯一id

- 就是不重复唯一的
- 唯一id生成的几种方式:
    - 1)数据库自动增长序列
        - 增加数据库写压力
        - 数据库故障后会出现不可用风险
        - 会暴露数据量
        - 分库分表设计难,不易扩展
    - 2)uuid
        - 数据太长
        - 数据无序
        - 若基于mac地址生成则会暴露
    - 3)使用redis的原子操作INCR和INCRBY来实现
        - 需要增加redis组件
        - 需要配置redis和编码来生成相对麻烦
    - 4)Twitter的snowflake算法
    - 5)其他方式

什么是雪花算法

- 最早是 Twitter 公司在其内部用于分布式环境下生成唯一 ID。在2014年开源 scala 语言版本。
- 雪花算法的原理就是生成一个的 64 位比特位的 long 类型的唯一 id。
    - 最高位 1 位固定值 0,因为生成的 id 是正整数,如果是 1 就是负数了。
    - 往后的 41 位存储毫秒级时间戳,2^41/(1000*60*60*24*365)=69,大概可以使用 69 年。
    - 往后的 10 位存储机器码,包括 5 位 datacenterId 和 5 位 workerId。最多可以部署 2^10=1024 台机器。
    - 最后的 12 位存储序列号。同一毫秒时间戳时,通过这个递增的序列号来区分。即对于同一台机器而言,同一毫秒时间戳下,可以生成 2^12=4096 个不重复 id。

为什么要用雪花算法

- 数据是有序的,有利于查询及排序
- 数据长度相比uuid还是很有优势
- 不需要其他插件
- 可分布式(最早就是用于分布式环境下生成唯一ID的)

通过toollib调用雪花算法

- 1) 安装toollib
    pip install toollib
- 2) 调用方法
    from toollib.guid import SnowFlake
    # 分布式需要根据ip或其他唯一标识映射机器码:worker_id与datacenter_id
    # 如:SnowFlake(worker_id=1, datacenter_id=1)
    # 更多参数详见源码
    snow = SnowFlake()
    uid = snow.gen_uid() 
    print(uid)
 类似资料: