分布式全局ID自增算法

数据库主键自增(Flicker)

先创建一个表

create table sequence_id(
    id bigint(20) unsigned NOT NULL auto_increment, 
    stub char(10) NOT NULL default '',
    PRIMARY KEY (id),
    UNIQUE KEY stub (stub)
) 

stub代表一个业务

获取ID

REPLACE INTO ticket_center (stub) VALUES ('test');  
SELECT LAST_INSERT_ID();

改进

主从

这种情况有可能因为从库没来得及同步从而生成重复的ID

双主

双主设置中,
其中一台机器值生成奇数ID

set @@auto_increment_offset = 1;     -- 起始值
set @@auto_increment_increment = 2;  -- 步长

其中一台机器值生成偶数ID

set @@auto_increment_offset = 2;     -- 起始值
set @@auto_increment_increment = 2;  -- 步长

业务随机从其中一个机器中取出一个ID,如果其中一台挂了,直接从另外一台生成。

优点

1.简单 2.ID递增

缺点

1.并发量不够高
2.水平扩展困难
3.安全系数低

Redis

incrby

incrby key n //n为步长,key代表一个业务

改进

单点吞吐不够,可以使用集群


image.png

同一个key在不同的节点上的初始值不同,步长相同,可以保证节点之间的value不相同

优点

1.性能更好
2.ID递增

缺点

1.水平扩展困难
2.集群宕机会导致产生重复id

UUID

UUID是一组32位的16进制数字,理论上总数为16^32 = 2 ^ 128个
UUID是利用同一时空中的所有机器都是唯一的这一规则来确保唯一性的。
UUID通过系统时间,时钟序列以及全局唯一的机器识别,例如网卡MAC,机器SN等

优点

相对安全,可以保证ID唯一

缺点

1.存储麻烦,太长了
2.无法自增

雪花算法snowflake

image.png

通过上面可以知道,最多可以是2 ^ 10 = 1024个全局唯一节点,最后12bit表示每毫秒生成的一个id序号。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容