分布式ID的生成方案

分布式id的生成方案有哪些呢?

最常见的就是UUID,数据库自增主键,redis自增id,雪花算法。

  • UUID

    UUID是通用唯一标识码的缩写,其目的是让分布式系统中的所有元素都有位移的辨识信息,而不需要通过*控制器来指定唯一标识。

    优点:

    1.降低全局节点的压力,使得主键生成速度更快。

    2.生成主键全局唯一。

    3.跨服务器合并数据方便。因为UUID都是不一样的,所以进行数据合并的时候直接合起来就OK了。

    缺点:

    1.UUID占用16个字符,空间占用比较多。

    2.不是递增有序的数字,数据写入IO随机性很大,且索引效率下降。为什么索引效率会下降呢?因为mysql的数字索引速率明显高于字符串索引效率。

  • 数据库主键自主

    mysql数据库设置主键且主键自动增长(auto increase)

    优点:

    1.int和bigint类型占用空间比较小。

    2.主键自动增长,IO写入连续性能好。

    3.数字类型查询速度明显优于字符串类型。

    缺点:

    1.并发性能不高,受限于数据库性能。因为数据库是在磁盘进行持久化的,磁盘的读写性能直接决定了数据库的性能,所以并发性不是很高。

    2.分库分表的改造复杂。比如我们有一个数据库,主键为1-1000,我们采用分库分表的方式进行分表,id以1结尾的分到1号库,2结尾的分到2号库,以此类推......,当我们分表完成后,主键仍使用自增的方式,势必会造成多个数据库中的不同表的主键重复,改造较为复杂。

    3.自增会导致数据量的泄密。前端可以通过id值判断你数据库中有多少数据。

  • Redis自增

    redis计数器,原子性自增。

    优点:

    使用内存,并发性能好。内存的读写性能远远优于磁盘。

    缺点:

    1.数据丢失。由于是在内存中使用,数据容易造成丢失,

    2.自增:数据量容易泄露。同mysql主键自增。

  • 雪花算法

    优点:

    1.不依赖外部组件。

    2.性能好。

    缺点:

    时钟回拨可能会导致重复数据。

那么雪花算法是什么呢?

    雪花算法生成的最终结果其实就是一个long类型的Java长整型数字,算法所有的内容都是针对这个数字进行运算的,Java基础类型相信都很熟悉,有32位的整型int类型,和64位的长整型long类型。

    雪花算法由四部分组成:

1.符号位,占用1位;

2.时间戳,占用41位,可支持69年的时间跨度;

3.机器ID,占用10位;

4.序列号,占用12位。一毫秒可以生成4095个ID;

分布式ID的生成方案

更多免费视频、学习资料请关注:

分布式ID的生成方案

 

 

上一篇:nanoid


下一篇:python实现掘金定时签到抽奖