还有一种常见的方案也叫自增,不过这种自增有点特殊,它是设置了步长的自增。
经过分库分表后我有10个表,可以让每个表按照步长生成自增ID,比如第一个表生成的是1,11,21,31
这种ID,第二个表生成的是2,12,22,32
这种ID,这种方案的关键是表内部自增。这种方案非常简单,而且本身我们在应用层面并不需要做任何事情,只是需要在创建表的时候指定好步长就可以了。ID虽然并不一定是全局递增的,但是在一个表内部,它肯定是递增的,这种方案的性能基本取决于数据库性能,应用层面上也不需要关注。
还可以从雪花类算法上找找亮点,雪花算法的原理不难,它的关键点在于分段。
雪花算法保证ID唯一性的理由:
- 时间戳是递增的,不同时刻产生的ID肯定是不同的
- 机器ID是不同的,同一时刻不同机器产生的ID肯定也是不同的
- 同一时刻同一机器上,可以轻易控制序列号
面试中要先回答这几个理由,然后解释:雪花算法采用64位来表示一个ID,其中1比特保留,41比特表示时间戳,10比特作为机器ID,12比特作为序列号
刷亮点有以下方法
第一个方法是深入讨论每个字段,关键点就是根据需求自定义各个字段含义、长度
大多数情况下,如果自己设计一个类似的算法,那么每个字段的含义、长度都可以灵活控制的,比如时间戳41比特可以改的更短或更长。
机器ID虽然明面上是机器ID,但是实际上并不是指物理机器,准确说是算法实例。例如,一台机器部署两个进行,每个进行的ID是不同的;又或者进一步切割,机器ID前半部分表示机器,后半部分可以表示这个机器上用于产生ID的进程、协程或线程。甚至机器ID也并不一定非得表示机器,也可以引入一些特定的业务含义。而序列号也是可以考虑加长或缩短的。
最后一句总结,升华主题
雪花算法可以算是一种思想,借助时间戳和分段,我们可以自由切割ID的不同比特位,赋予其不同的含义,灵活设计自己的ID算法。