數(shù)據(jù)庫主鍵自增(Flicker)
先創(chuàng)建一個(gè)表
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代表一個(gè)業(yè)務(wù)
獲取ID
REPLACE INTO ticket_center (stub) VALUES ('test');
SELECT LAST_INSERT_ID();
改進(jìn)
主從
這種情況有可能因?yàn)閺膸鞗]來得及同步從而生成重復(fù)的ID
雙主
雙主設(shè)置中,
其中一臺機(jī)器值生成奇數(shù)ID
set @@auto_increment_offset = 1; -- 起始值
set @@auto_increment_increment = 2; -- 步長
其中一臺機(jī)器值生成偶數(shù)ID
set @@auto_increment_offset = 2; -- 起始值
set @@auto_increment_increment = 2; -- 步長
業(yè)務(wù)隨機(jī)從其中一個(gè)機(jī)器中取出一個(gè)ID值依,如果其中一臺掛了抵蚊,直接從另外一臺生成室抽。
優(yōu)點(diǎn)
1.簡單 2.ID遞增
缺點(diǎn)
1.并發(fā)量不夠高
2.水平擴(kuò)展困難
3.安全系數(shù)低
Redis
incrby
incrby key n //n為步長惧财,key代表一個(gè)業(yè)務(wù)
改進(jìn)
單點(diǎn)吞吐不夠,可以使用集群
image.png
同一個(gè)key在不同的節(jié)點(diǎn)上的初始值不同孝鹊,步長相同炊琉,可以保證節(jié)點(diǎn)之間的value不相同
優(yōu)點(diǎn)
1.性能更好
2.ID遞增
缺點(diǎn)
1.水平擴(kuò)展困難
2.集群宕機(jī)會導(dǎo)致產(chǎn)生重復(fù)id
UUID
UUID是一組32位的16進(jìn)制數(shù)字,理論上總數(shù)為16^32 = 2 ^ 128個(gè)
UUID是利用同一時(shí)空中的所有機(jī)器都是唯一的這一規(guī)則來確保唯一性的又活。
UUID通過系統(tǒng)時(shí)間苔咪,時(shí)鐘序列以及全局唯一的機(jī)器識別,例如網(wǎng)卡MAC柳骄,機(jī)器SN等
優(yōu)點(diǎn)
相對安全团赏,可以保證ID唯一
缺點(diǎn)
1.存儲麻煩,太長了
2.無法自增
雪花算法snowflake
image.png
通過上面可以知道耐薯,最多可以是2 ^ 10 = 1024個(gè)全局唯一節(jié)點(diǎn)舔清,最后12bit表示每毫秒生成的一個(gè)id序號。