一般情况下,订单编号都是唯一的,普通人只知道用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 | import snowflake.client |
4. 启动多个服务
1 | snowflake_start_server --port=8920 --worker=2 |
5. 选择服务生成唯一id
1 | import snowflake.client |
6. 根据唯一id反推使用的哪个服务
1 | orderid = snowflake.client.get_guid() |
转换的结果就是使用的那个服务生成的唯一id了,这样就可以使用多个表存储唯一id,也就具备了相当强的业务属性
I'm so cute. Please give me money.
- 本文链接:https://x3cp.cn/2021/03/29/SnowFlake/
- 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。