# 分布式id解决方案


<!--more-->

[演示代码](https://gitee.com/ixinglan/cluster-demo.git)

例：分表之后，不用主键自增，采用分布式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.

  ```sql
  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 操作。

