1、分布式ID使用场景
互联网应用中,某个表可能要占用很大的物理存储空间,为了解决该问题,使用数据库分片技术。将一个数据库进行拆分,通过数据库中间件连接。如果数据库中该表选用ID自增策略,则可能产生重复的ID,此时应该使用分布式ID生成策略来生成ID。
2、分布式ID生成策略
方案一:UUID
可以生成32位、无序的数字。 缺点:太长,没办法排序
方案二:Redis
可以产出自增序号。缺点:主键生成需要访问redis,对redis有依赖
方案三:Oracle
数据库对象是序列,它与表无关。缺点:必须使用Oracle数据库
方案四:程序写算法,自己实现
自己考虑许多因素,缺点:费时费力
方案五:twitter的snowflake算法
3、snowflake算法
其原理结构如下:
分别用一个0表示一位,用---分割开部分的作用:
* 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000
* 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间,
* 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识),
* 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。
* 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分),
* 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。
* <p>
* 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加))