目录
方案一:数据库自增
数据库自增可以确保 ID 唯一,但会存在一定的问题。如多表合并成一张表,会出现 ID 冲突的情况。如下图:
方案二:UUID
UUID 确实可以作为主键生成的一种策略,但是大家都清楚,UUID 长度是128 bit ,是由128位二进制数据转换而来,其中有四个固定的 “-” 进行分割,每四个二进制转换为一个十六进制,128/4=32,UUID 最终的组成是由32个十六进制数组成。其缺点一目了然,It's too long。
方案三:全局Redis
我们可以通过 Redis 的计数器实现 ID 的自增唯一,每次从 Redis 取出值作为主键,但是会消耗很多网络资源。
方案四:雪花算法
采用 twitter 开源的的 snowflake 算法实现 ID 生成,结构如下图:
1bit-不用:因为二进制中最高位是符号位,1表示负数,0表示正数。生成的 ID 一般都是用整数,所以最高位固定为0。
41bit-时间戳:用来记录毫秒级的时间戳。
10bit-工作机器ID:用来记录工作机器 ID。
12bit-序列号:用来记录同毫秒内产生的不同 ID。
- 优势
- 生成有序的 Long 形数据
- 生成的数据按照时间趋势递增
- 由于有 datacenterId 和 workerId 来做区分,所以整个系统内不会产生重复 ID
- 劣势
- 需要独立部署 ID 生成器,增加维护成本
总结
上述四种方案均可实现 ID 生成策略,各位按需采纳,根据实际业务场景进行选型。