亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 5616 | 回復(fù): 1
打印 上一主題 下一主題

[MongoDB] MongoDB文檔(Document)全局唯一ID的設(shè)計思路 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-02-22 14:59 |只看該作者 |倒序瀏覽
MongoDB文檔(Document)全局唯一ID的設(shè)計思路






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

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

MongoDB中數(shù)據(jù)的基本單元稱為文檔(Document)。文檔是MongoDB的核心概念,多個鍵極其關(guān)聯(lián)的值有序的放置在一起便是文檔。

在一個特定集合內(nèi)部,需要唯一的標(biāo)識文檔。因此MongoDB中存儲的文檔都由一個”_id”鍵,用于完成此功能。這個鍵的值可以是任意類型的,默認(rèn)試ObjectId對象。ObjectId對象的生成思路是本文的主題,也是很多分布式系統(tǒng)可以借鑒的思路。

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

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

0 1 2 3 4 5 6 7 8 9 10 11
時間戳 機器ID PID 計數(shù)器

前四個字節(jié)時間戳是從標(biāo)準(zhǔn)紀(jì)元開始的時間戳,單位為秒,有如下特性:

時間戳與后邊5個字節(jié)一塊,保證秒級別的唯一性;
保證插入順序大致按時間排序;
隱含了文檔創(chuàng)建時間;
機器ID是服務(wù)器主機標(biāo)識,通常是機器主機名的散列值。

同一臺機器上可以運行多個mongod實例,因此也需要加入進(jìn)程標(biāo)識符PID。

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

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

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




論壇徽章:
0
2 [報告]
發(fā)表于 2012-02-24 17:36 |只看該作者
謝謝分享
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP