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

如何使用MongoDb實現分布式Id?

劉柏宏2年前15瀏覽0評論

傳統數據庫軟件開發中,主鍵自動生成技術各大數據庫對于該需求也提供了相應的支持,比如MySQL的自增。

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

github上對分布式ID這個特性的描述是:分布式唯一和時間序列。

主要方案方案包括

  1. 使用reids的incr命令
  2. 使用UUID
  3. Twitter的snowflake算法
  4. 利用zookeeper生成唯一ID
  5. MongoDB的ObjectId

MongoDB的ObjectId設計成輕量型的,不同的機器都能用全局唯一

它的格式:

  • 前4個字節是從標準紀元開始的時間戳,單位為秒。時間戳,與隨后的5個字節組合起來,提供了秒級別的唯一性。由于時間戳在前,這意味著ObjectId大致會按照插入的順序排列。這對于某些方面很有用,如將其作為索引提高效率。這4個字節也隱含了文檔創建的時間。絕大多數客戶端類庫都會公開一個方法從ObjectId獲取這個信息。

  • 接下來的3字節是所在主機的唯一標識符。通常是機器主機名的散列值。這樣就可以確保不同主機生成不同的ObjectId,不產生沖突。為了確保在同一臺機器上并發的多個進程產生的ObjectId是唯一的,接下來的兩字節來自產生ObjectId的進程標識符(PID)。

  • 前9字節保證了同一秒鐘不同機器不同進程產生的ObjectId是唯一的。
  • 后3字節就是一個自動增加的計數器,確保相同進程同一秒產生的ObjectId也是不一樣的。同一秒鐘最多允許每個進程擁有2563(16777216)個不同的ObjectId。

機器ID是服務器主機標識,通常是機器主機名的散列值。

同一臺機器上可以運行多個mongod實例,因此也需要加入進程標識符PID。

前9個字節保證了同一秒鐘不同機器不同進程產生的ObjectId的唯一性。后三個字節是一個自動增加的計數器(一個mongod進程需要一個全局的計數器),保證同一秒的ObjectId是唯一的。同一秒鐘最多允許每個進程擁有(256^3=16777216)個不同的ObjectId。

總結一下:時間戳保證秒級唯一,機器ID保證設計時考慮分布式,避免時鐘同步,PID保證同一臺服務器運行多個mongod實例時的唯一性,最后的計數器保證同一秒內的唯一性(選用幾個字節既要考慮存儲的經濟性,也要考慮并發性能的上限)。

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

主要參考:

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

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