在分布式開發(fā)過程中,常常為數(shù)據(jù)唯一標(biāo)識(shí)苦惱,雖然數(shù)據(jù)庫提供了字段自增長,使用起來也簡(jiǎn)單,但是在數(shù)據(jù)庫改造過程中要分庫分表的時(shí)候,不能保證這些數(shù)據(jù)標(biāo)識(shí)的唯一;UUID出現(xiàn),保證了數(shù)據(jù)標(biāo)識(shí)的全球唯一,但是其生成為字符串,索引查詢和存儲(chǔ)效率低,并且生成標(biāo)識(shí)不具有順序性,導(dǎo)致后期的數(shù)據(jù)排序產(chǎn)生新的問題, 下面介紹了三種分布式環(huán)境下生成唯一ID的解決方案:UUID,Redis,SnowFlake,比較了一下它們?nèi)齻€(gè)的優(yōu)缺點(diǎn)
1. UUID
生成方式:?UUID 可以在程序中或者在數(shù)據(jù)庫中生成; 其目的是讓分布式系統(tǒng)中數(shù)據(jù)可以有唯一的存在標(biāo)識(shí); ?生成算法的核心思想是結(jié)合機(jī)器的網(wǎng)卡(若無網(wǎng)卡,找尋其它機(jī)器硬件唯一標(biāo)識(shí)碼代替)访惜、當(dāng)?shù)貢r(shí)間咽筋、一個(gè)隨即數(shù)來生成UUID,可以實(shí)現(xiàn)全球唯一
優(yōu)點(diǎn): ?(1)生成簡(jiǎn)單,性能好;
? ? ? ? ? ?(2)生成規(guī)則和網(wǎng)卡號(hào)等等機(jī)器硬件唯一編號(hào)有關(guān)系,所以可以實(shí)現(xiàn)全球唯一;
? ? ? ? ? ?(3)可以應(yīng)對(duì)系統(tǒng)合并和數(shù)據(jù)遷移的問題;
缺點(diǎn): ?(1) 無序的,不能保證生成ID的遞增關(guān)系,當(dāng)數(shù)據(jù)分庫存儲(chǔ)時(shí),不利于數(shù)據(jù)的排序; ?
? ? ? ? ? ?(2)字符串存儲(chǔ),當(dāng)字符串比較大的時(shí)候,查詢的性能比較低,并且在海量數(shù)據(jù)下占用的存儲(chǔ)空間比較大,系統(tǒng)之間傳輸?shù)拈_銷比較大;
? ? ? ? ? ?(3)生成的字符串不可讀,不友好;
2. Redis實(shí)現(xiàn)
? ? 生成方式: ?利用redis的lua腳本執(zhí)行功能令哟,在每個(gè)節(jié)點(diǎn)上通過lua腳本生成唯一ID
? ? ? ? 實(shí)現(xiàn)比較靈活,生成的ID格式可以自定義, 舉例實(shí)現(xiàn)方式:
????????使用41 bit來存放時(shí)間,精確到毫秒齿椅,可以使用41年; 使用12 bit來存放邏輯分片ID戈轿, ? ? ?最大分片ID是4095; 使用10 bit來存放自增長ID,意味著每個(gè)節(jié)點(diǎn)店雅,每毫秒最多可以生成1024個(gè)ID; 因此, 生成唯一標(biāo)識(shí)為64位;
優(yōu)點(diǎn): ?(1) 生成ID靈活,可以自定義生成唯一標(biāo)識(shí)的格式;
? ? ? ? ? ? (2) 單線程,不存在線程安全的問題;
缺點(diǎn): ?(1) 開發(fā)成本高,相對(duì)于其它解決方案開發(fā)過程復(fù)雜
? ? ? ? ? ? (2)Redis的單線程雖然保證了線程的安全,但是在高負(fù)載的系統(tǒng)中成為系統(tǒng)的瓶頸
? ? ? ? ? ? (3)時(shí)間倒流的時(shí)候,不能保證系統(tǒng)生成的唯一性
3. twitter家自用的Snowflake
(1) 41位的時(shí)間序列(精確到毫秒政基,41位的長度可以使用69年)
(2) 10位的機(jī)器標(biāo)識(shí)(10位的長度最多支持部署1024個(gè)節(jié)點(diǎn))
(3) 12位的計(jì)數(shù)順序號(hào)(12位的計(jì)數(shù)順序號(hào)支持每個(gè)節(jié)點(diǎn)每毫秒產(chǎn)生4096個(gè)ID序號(hào)) 最高位是符號(hào)位,始終為0闹啦。
優(yōu)點(diǎn):高性能沮明,低延遲;獨(dú)立的應(yīng)用窍奋;可以按照按時(shí)間有序,適合分布式環(huán)境數(shù)據(jù)排序
缺點(diǎn):需要獨(dú)立的開發(fā)和部署; 存在時(shí)間倒退的風(fēng)險(xiǎn)問題;
如果是在復(fù)雜分布式系統(tǒng)中,上面三個(gè)傾力推薦Snowflake, 開發(fā)使用相對(duì)UUID來說比較復(fù)雜,但是比Redis來做要簡(jiǎn)單;
未完待續(xù)...
發(fā)現(xiàn)好的解決方案,繼續(xù)添加!!!