分布式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的二进制形式示意:
另外,一切互联网公司也基于上述的方案封装了一些分布式ID生成器,比如滴滴的tinyid(基于数据库实现)、百度的uidgenerator(基于SnowFlake)和美团的leaf(基于数据库和SnowFlake)等
-
借助Redis的Incr命令获取全局唯一ID(推荐)
Redis Incr 命令将 key 中储存的数字值增一。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。