MongoDB文檔(Document)全局唯一ID的設計思路

MongoDB中,如果不特別指定,每個文檔都會生成一個唯一的ObjectId作爲其主鍵_id的值。這個值是一個看似隨機的串。這個串到底是什麼值?爲什麼MongoDB要使用這個值作爲默認主鍵?它內部又包含了什麼樣的信息?如果你還不瞭解,就請看下面文章吧。

感謝劉浩@人民搜索的投稿。

MongoDB中數據的基本單元稱爲文檔(Document)。文檔是MongoDB的核心概念,多個鍵極其關聯的值有序的放置在一起便是文檔。

在一個特定集合內部,需要唯一的標識文檔。因此MongoDB中存儲的文檔都由一個”_id”鍵,用於完成此功能。這個鍵的值可以是任意類型的,默認試ObjectId對象。ObjectId對象的生成思路是本文的主題,也是很多分佈式系統可以借鑑的思路。

爲了考慮分佈式,“_id”要求不同的機器都能用全局唯一的同種方法方便的生成它。因此不能使用自增主鍵(需要多臺服務器進行同步,既費時又費力),因此選用了生成ObjectId對象的方法。

ObjectId使用12字節的存儲空間,其生成方式如下:

 

前四個字節時間戳是從標準紀元開始的時間戳,單位爲秒,有如下特性:

  1. 時間戳與後邊5個字節一塊,保證秒級別的唯一性;
  2. 保證插入順序大致按時間排序;
  3. 隱含了文檔創建時間;

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

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

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

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

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

來源:www.cnblogs.com

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章