分布式ID使用场景及生成策略分析

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(重复累加))

猜你喜欢

转载自blog.csdn.net/py_tamir/article/details/81459214