一般情况下,订单编号都是唯一的,普通人只知道用uuid生成订单号,但是用uuid生成的编号做主键,会十分影响查询效率,而且丝毫没有一点顺序,而mysql主键的特点就是唯一 有序,所以uuid并不适合作为主键,但是雪花算法生成的编号却正好满足了订单号和mysql的所有需求,而且雪花算法还可以分表存储,当业务量巨大的时,雪花算法也可以轻松满足
snowflake会生成一个64位的二进制整数,然后转换成十进制的数,64位二进制数由如下部分组成:

1位标识符:始终是0
41位时间戳:41位时间戳不是存储当前时间的时间戳,而是存储时间截的差值(当前时间截 - 开始时间截 )得到的值,这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的
10位机器标识码:可以部署在1024个节点,如果机器分机房(IDC)部署,这10位可以由 5位机房ID + 5位机器ID 组成
12位序列:毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号

1. 安装库

1
pip install pysnowflake

2. 启动服务

1
snowflake_start_server --worker=1

3. 生成唯一id

1
2
3
import snowflake.client

print(snowflake.client.get_guid())

4. 启动多个服务

1
snowflake_start_server --port=8920 --worker=2

5. 选择服务生成唯一id

1
2
3
4
5
6
import snowflake.client

host = '127.0.0.1'
port = 8920 # 启动服务的端口号,不加默认第一个服务
snowflake.client.setup(host, port)
orderid = snowflake.client.get_guid()

6. 根据唯一id反推使用的哪个服务

1
2
3
4
5
orderid = snowflake.client.get_guid()
print(bin(orderid))
ft = bin(orderid)[-17:-12]
print(int(ft, 2))
1 # 结果

转换的结果就是使用的那个服务生成的唯一id了,这样就可以使用多个表存储唯一id,也就具备了相当强的业务属性