色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

如何使用MongoDb實(shí)現(xiàn)分布式Id

如何使用MongoDb實(shí)現(xiàn)分布式Id?

傳統(tǒng)數(shù)據(jù)庫(kù)軟件開(kāi)發(fā)中,主鍵自動(dòng)生成技術(shù)各大數(shù)據(jù)庫(kù)對(duì)于該需求也提供了相應(yīng)的支持,比如MySQL的自增。

分布式ID特性包括:唯一性:確保生成的ID是全網(wǎng)唯一的;高可用性:確保任何時(shí)候都能正確的生成ID。

github上對(duì)分布式ID這個(gè)特性的描述是:分布式唯一和時(shí)間序列。

主要方案方案包括

使用reids的incr命令使用UUIDTwitter的snowflake算法利用zookeeper生成唯一IDMongoDB的ObjectId

MongoDB的ObjectId設(shè)計(jì)成輕量型的,不同的機(jī)器都能用全局唯一

它的格式:

前4 個(gè)字節(jié)是從標(biāo)準(zhǔn)紀(jì)元開(kāi)始的時(shí)間戳,單位為秒。時(shí)間戳,與隨后的5 個(gè)字節(jié)組合起來(lái),提供了秒級(jí)別的唯一性。由于時(shí)間戳在前,這意味著ObjectId 大致會(huì)按照插入的順序排列。這對(duì)于某些方面很有用,如將其作為索引提高效率。這4 個(gè)字節(jié)也隱含了文檔創(chuàng)建的時(shí)間。絕大多數(shù)客戶端類庫(kù)都會(huì)公開(kāi)一個(gè)方法從ObjectId 獲取這個(gè)信息。

接下來(lái)的3 字節(jié)是所在主機(jī)的唯一標(biāo)識(shí)符。通常是機(jī)器主機(jī)名的散列值。這樣就可以確保不同主機(jī)生成不同的ObjectId,不產(chǎn)生沖突。 為了確保在同一臺(tái)機(jī)器上并發(fā)的多個(gè)進(jìn)程產(chǎn)生的ObjectId 是唯一的,接下來(lái)的兩字節(jié)來(lái)自產(chǎn)生ObjectId 的進(jìn)程標(biāo)識(shí)符(PID)。

前9 字節(jié)保證了同一秒鐘不同機(jī)器不同進(jìn)程產(chǎn)生的ObjectId 是唯一的。后3 字節(jié)就是一個(gè)自動(dòng)增加的計(jì)數(shù)器,確保相同進(jìn)程同一秒產(chǎn)生的ObjectId 也是不一樣的。同一秒鐘最多允許每個(gè)進(jìn)程擁有2563(16 777 216)個(gè)不同的ObjectId。

機(jī)器ID是服務(wù)器主機(jī)標(biāo)識(shí),通常是機(jī)器主機(jī)名的散列值。

同一臺(tái)機(jī)器上可以運(yùn)行多個(gè)mongod實(shí)例,因此也需要加入進(jìn)程標(biāo)識(shí)符PID。

前9個(gè)字節(jié)保證了同一秒鐘不同機(jī)器不同進(jìn)程產(chǎn)生的ObjectId的唯一性。后三個(gè)字節(jié)是一個(gè)自動(dòng)增加的計(jì)數(shù)器(一個(gè)mongod進(jìn)程需要一個(gè)全局的計(jì)數(shù)器),保證同一秒的ObjectId是唯一的。同一秒鐘最多允許每個(gè)進(jìn)程擁有(256^3 = 16777216)個(gè)不同的ObjectId。

總結(jié)一下:時(shí)間戳保證秒級(jí)唯一,機(jī)器ID保證設(shè)計(jì)時(shí)考慮分布式,避免時(shí)鐘同步,PID保證同一臺(tái)服務(wù)器運(yùn)行多個(gè)mongod實(shí)例時(shí)的唯一性,最后的計(jì)數(shù)器保證同一秒內(nèi)的唯一性(選用幾個(gè)字節(jié)既要考慮存儲(chǔ)的經(jīng)濟(jì)性,也要考慮并發(fā)性能的上限)。

"_id"既可以在服務(wù)器端生成也可以在客戶端生成,在客戶端生成可以降低服務(wù)器端的壓力。

主要參考:

https://blog.csdn.net/forezp/article/details/69056017

https://www.cnblogs.com/xjk15082/archive/2011/09/18/2180792.html