目录

分布式id解决方案

目录

演示代码

例:分表之后,不用主键自增,采用分布式id方案

  • UUID

    UUID 是指Universally Unique Identifier,翻译为中文是通用唯一识别码

    产生重复 UUID 并造成错误的情况非常低,是故大可不必考虑此问题。

    Java中得到一个UUID,可以使用java.util包提供的方法

  • 独立数据库的自增id

    比如A表分表为A1表和A2表,那么肯定不能让A1表和A2表的ID自增,那么ID怎么获取呢?我们可以单独的创建一个Mysql数据库,在这个数据库中创建一张表,这张表的ID设置为自增,其他地方需要全局唯一ID的时候,就模拟向这个Mysql数据库的这张表中模拟插入一条记录,此时ID会自增,然后我们可以通过Mysql的select last_insert_id() 获取到刚刚这张表中自增生成的ID.

    insert into DISTRIBUTE_ID(createtime) values(NOW()); 
    select LAST_INSERT_ID()
  • SnowFlake 雪花算法(可以用,推荐)

    雪花算法是Twitter推出的一个用于生成分布式ID的策略。 雪花算法是一个算法,基于这个算法可以生成ID,生成的ID是一个long型,那么在Java中一个long型是8个字节,算下来是64bit,

    如下是使用雪花算法生成的一个ID的二进制形式示意:

    https://img.zhaojq.top/20260727091647174.png
    示意图

    另外,一切互联网公司也基于上述的方案封装了一些分布式ID生成器,比如滴滴的tinyid(基于数据库实现)、百度的uidgenerator(基于SnowFlake)和美团的leaf(基于数据库和SnowFlake)等

  • 借助Redis的Incr命令获取全局唯一ID(推荐)

    Redis Incr 命令将 key 中储存的数字值增一。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。