主键策略,数据库id值生成方式及其优缺点
主键策略
一:自动增长(AUTO INCREMENT)
可以在定义数据库时添加这一字段.实现id值的自动增长
例子:假设有三张表主键分别为不足之处:当我们操作第二张表的时候需要根据上一张表的最后那个数据的id值来进行划分
二:UUID
每次生成一个随机唯一的值缺点:排序不方便
三:redis实现优点:
1.不依赖于数据库,灵活方便,且性能优于数据库
2.数据ID天然排序,对分页或者需要排序的结果很有帮助
缺点:
1.如果系统中没有Redis,还需要引入新的组件,增加系统的复杂度
2.需要编码和配置的工作量比较大
四:mp自带的策略(雪花算法)
SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图:
1.
1bit,不用,因为二进制中最高位是符号位,1表示负数,0表示正数。生成的id一般都是用整数,所以最高位固定为0。
2.
41bit-时间戳,用来记录时间戳,毫秒级。
3.
10bit-工作机器id,用来记录工作机器id。
可以部署在2^{10} = 1024个节点,包括5位datacenterId和5位workerId
5位(bit)可以表示的最大正整数是2^{5}-1 = 31,即可以用0.1.2.3、…31这32个数字,来表示不同的datecenterId或workerId
4.
12bit-***,***,用来记录同毫秒内产生的不同id。
12位(bit)可以表示的最大正整数是2^{12}-1 = 4095,即可以用0.1.2.3…4094这4095个数字,来表示同一机器同一时间截(毫秒)内产生的4095个ID序号。
由于在Java中64bit的整数是long类型,所以在Java中SnowFlake算法生成的id就是long来存储的。
SnowFlake可以保证:
1.所有生成的id按时间趋势递增
2.整个分布式系统内不会产生重复id(因为有datacenterId和workerId来做区分)