柚子快報(bào)邀請(qǐng)碼778899分享:分布式 id
柚子快報(bào)邀請(qǐng)碼778899分享:分布式 id
分布式 id
分布式 id 生成策略雪花算法UUID 與自增 ID 的優(yōu)缺點(diǎn)
分布式 id 需要處理的問題主要是同一時(shí)間在多臺(tái)機(jī)器中保證生成的 id 唯一,為了這么做我們可以這么做:
分布式 id 生成策略
先說幾個(gè)已經(jīng)被淘汰的策略引出分布式 id 的問題
1,UUID:UUID 全稱為通用唯一識(shí)別碼,是由一組32位數(shù)的16進(jìn)制數(shù)字所構(gòu)成,是故UUID理論上的總數(shù)為16^32 = 2^128,約等于3.4 x 10^38。也就是說若每納秒產(chǎn)生1兆個(gè) UUID,要花100億年才會(huì)將所有 UUID 用完,UUID 隨機(jī)并且唯一,在單一的數(shù)據(jù)庫中就不適合作為主鍵,因?yàn)樯傻淖址L(zhǎng)不符合索引優(yōu)化規(guī)則
2,自增 ID:不管是數(shù)據(jù)庫自增還是MP自增,分布式數(shù)據(jù)庫中總是要存放一定范圍的數(shù)據(jù),使用自增策略可能會(huì)導(dǎo)致不同數(shù)據(jù)庫存放同一id的問題
以下生成分布式 id 的方法比較靠譜
3,redis 生成:利用 redis 的 incr 命令生成 id,設(shè)置起始值和步長(zhǎng),步長(zhǎng)值是配置了多少臺(tái) redis,這種方法同樣適應(yīng)與數(shù)據(jù)庫多主模式
4,雪花算法:生成一個(gè)64bit 的 id,也就是 long 類型的數(shù)字,長(zhǎng)度適中并且方便快捷
雪花算法
雪花算法是一個(gè)比較常見的生成分布式 id 的方式,它會(huì)生成一個(gè) 8 字節(jié)的數(shù)據(jù),通過確保每段數(shù)據(jù)在空間與時(shí)間上唯一來確定最終數(shù)據(jù)的唯一
64bit 中,起始 1bit 為0,閑置不用
接下來 41bit 代表時(shí)間戳,這個(gè)是毫秒級(jí)的時(shí)間,存放時(shí)間戳的差值(當(dāng)前時(shí)間-固定的開始時(shí)間),41位的時(shí)間戳可以使用69年 10bit 存放機(jī)器 id,前 5bit 代表機(jī)器位置(配置在不同地區(qū)的機(jī)器有不同 id),后 5bit 代表機(jī)器 id (一個(gè)地區(qū)會(huì)配置集群) 最后的 12bit 代表流水號(hào),一個(gè)毫秒時(shí)間內(nèi)最多可以處理4096個(gè) id
UUID 與自增 ID 的優(yōu)缺點(diǎn)
對(duì)于所有的 UUID 它可以保證在空間和時(shí)間上的唯一性。它是通過 MAC 地址,時(shí)間戳,隨機(jī)數(shù)等數(shù)據(jù)來保證生成 ID 的唯一性,有著固定的大小(128bit)。因此它可以用于分布式的生產(chǎn)環(huán)境,以支持更高的并發(fā)
它的缺點(diǎn)是更占用空間,并且存放的是 varchar 類型,在通過 ID 查找的時(shí)候的效率很低
無序,隨機(jī)生成與插入,聚集索引頻繁頁分裂,大量隨機(jī) IO,內(nèi)存碎片化,特別是隨著數(shù)據(jù)量越來越多,插入性能會(huì)越差
因此在并發(fā)數(shù)不是很高的情況下使用自增 ID 是不錯(cuò)的方法,主鍵頁以近乎順序的方式填寫,提升了頁的利用率。索引更加緊湊,性能更好查詢時(shí)數(shù)據(jù)訪問更快,連續(xù)增長(zhǎng)的值能避免 b+ 樹頻繁合并和分裂
柚子快報(bào)邀請(qǐng)碼778899分享:分布式 id
參考閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。