8.1 为啥这样做
1.全局唯一性,不会出现重复的id。
如果通过id自增来保证id不重复,则该表 无法分表操作
例如 服务器A的数据库的user表 数据如下
1 小明 男
2 小红 女
2 张三 男
此时 进行分表 服务器B,C的数据库中创建user表 分别存储第2,3条数据
B
1 小红 女
C
1 张三 男
此时存在问题,id重复
2.生成的id是随时间递增的,在执行sql操作时,会提高效率
3.每毫秒产生2^12-1个序列号,在高并发环境下表现良好
8.2 介绍雪花算法
雪花算法优点:
1.高并发分布式环境下生成不重复id
2.id随时间自增,在执行sql操作时,会提高效率
雪花算法缺点:
依赖于服务器时间,服务器时钟回拨时可能会生成重复id。
解决方法:通过记录最后一个生成id时的时间戳,每次生成id之前比较当前服务器时间是否回拨,避免生成重复id。
时钟回拨:硬件时钟可能会因为各种原因发生不准的情况,网络中提供了ntp服务来做时间校准,做校准时就会发生时钟的跳跃或者回拨。
64位整数组成的分布式ID
使用github.com/sony/sonyflake
库的雪花算法
注意:下图中第三块和第四块标记反了,第三块为Machine ID(机器id) 第四块为Sequence ID(序列id)
1bit: 符号位,固定为0,没有实际作用
39bit: 表示 时间戳,单位是 10毫秒。用来代表创建ID的时刻与起始时刻的偏移量。起始时刻在雪花算法初始化时就指定
8bit: 机器id。分布式部署时,可能有多台服务器都可以生成ID,使用机器id来表示唯一的服务器
16bit: 序列id,用来记录 同一毫秒产生的不同id 每毫秒可用生成2^16-1个id
8.3 代码
pkg/snowflake/snowflake.go
package snowflake
import (
"fmt"
"time"