什么是唯一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)