数据库主键自增(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代表一个业务
改进
单点吞吐不够,可以使用集群
同一个key在不同的节点上的初始值不同,步长相同,可以保证节点之间的value不相同
优点
1.性能更好
2.ID递增
缺点
1.水平扩展困难
2.集群宕机会导致产生重复id
UUID
UUID是一组32位的16进制数字,理论上总数为16^32 = 2 ^ 128个
UUID是利用同一时空中的所有机器都是唯一的这一规则来确保唯一性的。
UUID通过系统时间,时钟序列以及全局唯一的机器识别,例如网卡MAC,机器SN等
优点
相对安全,可以保证ID唯一
缺点
1.存储麻烦,太长了
2.无法自增
雪花算法snowflake
通过上面可以知道,最多可以是2 ^ 10 = 1024个全局唯一节点,最后12bit表示每毫秒生成的一个id序号。