摘要:原文地址唯一的生成并不是一件小事想說(shuō)愛(ài)它也并不是像簡(jiǎn)單來(lái)一個(gè)這樣一件容易的事為什么要唯一數(shù)據(jù)庫(kù)的自增在分庫(kù)的時(shí)候會(huì)是一場(chǎng)災(zāi)難假設(shè)分兩個(gè)庫(kù)因?yàn)槊總€(gè)庫(kù)都會(huì)開(kāi)始從開(kāi)始自增屆時(shí)系統(tǒng)中將會(huì)出現(xiàn)兩個(gè)為的用戶自增會(huì)暴露用戶量或者其他業(yè)務(wù)量自增會(huì)讓有心者
[原文地址:https://blog.ti-node.com/blog...]
唯一ID的生成并不是一件小事 , 想說(shuō)愛(ài)它 , 也并不是像簡(jiǎn)單來(lái)一個(gè)uniqid()這樣一件容易的事 .
為什么要唯一ID ?
1 . 數(shù)據(jù)庫(kù)的自增ID在分庫(kù)的時(shí)候 , 會(huì)是一場(chǎng)災(zāi)難 . 假設(shè)分兩個(gè)庫(kù) , 因?yàn)槊總€(gè)庫(kù)都會(huì)開(kāi)始從1開(kāi)始自增 , 屆時(shí) , 系統(tǒng)中將會(huì)出現(xiàn)兩個(gè)id為1的用戶 .
2 . 自增id會(huì)暴露用戶量或者其他業(yè)務(wù)量 .
3 . 自增id會(huì)讓有心者通過(guò)API得到任意用戶的信息資料 .
解決方案呢 ?
1 . UUID , 全稱Universally Unique Identifier , 中文通用唯一標(biāo)識(shí)符 . 這個(gè)是開(kāi)放軟件基金會(huì)組織提出的一個(gè)標(biāo)準(zhǔn) , 為的就是解決分布式環(huán)境下生成唯一標(biāo)識(shí)符的問(wèn)題 . UUID的長(zhǎng)度是固定的32位 , 組織格式8-4-4-4-12 , 當(dāng)然了在用的時(shí)候 , 中間的分隔符是要去掉的 . 這個(gè)貨有幾個(gè)問(wèn)題不得不提 , 首先是字母數(shù)字混合 , 在一些傳統(tǒng)數(shù)據(jù)庫(kù)下 , 索引不太好做 , 不僅索引體積大 , 查詢效率也差 . 其次是它本身也非常大 .
2 . MongoDB ObjectId , 格式模樣都很類似于UUID , 是Mongodb內(nèi)置的一種數(shù)據(jù)類型 , 如果你在插入數(shù)據(jù)的時(shí)候不指定_id , 那么Mongodb默認(rèn)就會(huì)采用用這個(gè)貨才填充_id , 在Mongodb這種類kv性質(zhì)的數(shù)據(jù)庫(kù)中 , 有著不錯(cuò)的查詢效率 .
3 . 自建解決方案 , 為了能夠解決業(yè)務(wù)問(wèn)題 , 很多公司都自己提出一些解決方案 , 這些方案無(wú)疑都要做到如下幾點(diǎn) :
保證全局空間唯一性
保證盡量采取數(shù)字類型而非數(shù)字字母混合方式
保證一定的時(shí)序行和含義
保證一定的可反解性 , 通過(guò)反解的結(jié)果可以知道該ID的相關(guān)信息
市面上有的幾種解決方案為T(mén)witter的snowflake , Flikr的數(shù)據(jù)庫(kù)自增方案 , Instagram的數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程方案 . 重點(diǎn)說(shuō)下Twitter的snowflake解決方案原理 .
snowflask使用了64bit來(lái)表示一個(gè)id , Twitter的工程師們將它分成了4個(gè)段 , 每段表示不同的含義 . 如下圖 :
前41bit段 , 是時(shí)間戳 , 單位會(huì)精確到毫秒級(jí) . 所以該bit段可以容納的時(shí)間容量為 2^41 = 2.199x10^12 毫秒 , 也就是 2.199x10^9 秒 . 換算成年 , 就是大概為69.7年 . 也就說(shuō) , 從1970年1月1日開(kāi)始 , 可以使用69.7年 , id產(chǎn)生機(jī)器的上限就到了 .
中10bit段 , 是機(jī)器ID , 最大可以容納2^10=1024臺(tái)機(jī)器 . 你可以部署1一臺(tái)以上的機(jī)器 , 給每個(gè)機(jī)器配置一個(gè)與眾不同的獨(dú)立的id號(hào) , 比如從1號(hào)開(kāi)始 , 最多可以部署到1024號(hào)機(jī)器 . 然后機(jī)器集群最前面擋一臺(tái)nginx之類的服務(wù)器做代理 , 就可以完成一個(gè)不錯(cuò)的id發(fā)號(hào)集群了 .
后12bit段 , 是自增序列( 你可以等同為mysql的自增id ) , 它表示的1毫秒內(nèi)的自增序列 . 也就是說(shuō)從0毫秒開(kāi)始一直到1毫秒結(jié)束這段時(shí)間內(nèi)自增 . 也就說(shuō)1毫秒內(nèi)最多產(chǎn)生2^12=4096個(gè)序列 , 也就是說(shuō)同一臺(tái)機(jī)器上同一毫秒內(nèi)最多產(chǎn)生4096個(gè)序列 , 如果超過(guò)了該數(shù)字 , 那就等待下一毫秒產(chǎn)生新的id .
TIPS : 順帶提一下 , php的uniqid()函數(shù)存在很大的風(fēng)險(xiǎn) , 它生成的id并不能像它的名字那樣做到uniqid , 重復(fù)概率略高 . 詳情查看該函數(shù)的手冊(cè)頁(yè)評(píng)論 . 點(diǎn)擊這里
TIPS : 推薦一個(gè)基于snowflake的php id產(chǎn)生器 : donkeyid生成器
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/29340.html
摘要:向指定資源提交數(shù)據(jù)比如提交表單,上傳文件,請(qǐng)求服務(wù)器進(jìn)行處理。通過(guò)指定資源的唯一標(biāo)識(shí)在服務(wù)器上的具體存放位置,請(qǐng)求服務(wù)器創(chuàng)建或更新資源。請(qǐng)求中會(huì)把和一并發(fā)送,但是會(huì)先發(fā)送瀏覽器響應(yīng)之后,再發(fā)送。 HTTP請(qǐng)求 HTTP請(qǐng)求由三部分組成: 請(qǐng)求行:包含請(qǐng)求方法、地址和HTTP的協(xié)議版本 消息報(bào)頭:包含一系列的鍵值對(duì) 請(qǐng)求正文(可選):和消息報(bào)頭之間有一個(gè)空行 信息報(bào)頭中的主要信息有 ...
小編寫(xiě)這篇文章,主要目的還是給大家講一下關(guān)于python代碼的相關(guān)事宜,比如怎么才能夠?qū)崿F(xiàn)自動(dòng)生產(chǎn)C++代碼,這里面還是比較的復(fù)雜的,下面小編就給大家貼出具體的代碼給大家來(lái)看下?! ∮龅降膯?wèn)題 工作中遇到這么一個(gè)事,需要寫(xiě)比較多的C++的底層數(shù)據(jù)庫(kù)類,但這些類大同小異,無(wú)非是增刪改查,如果人工來(lái)寫(xiě)代碼,既費(fèi)力又容易出錯(cuò);而借用python的代碼自動(dòng)生成,可以輕松搞定; ?。惐菾AVA中的H...
摘要:依賴于接口的設(shè)計(jì)模式下面列出的設(shè)計(jì)模式,尤其依賴接口工廠模式。這些私用的靜態(tài)成員可以從構(gòu)造器內(nèi)部訪問(wèn),這意味著所有私用函數(shù)和特權(quán)函數(shù)都能訪問(wèn)它們。構(gòu)造器靜態(tài)特權(quán)方法封裝之弊私用方法很難進(jìn)行單元測(cè)試。 1.弱類型語(yǔ)言 在JavaScript中,定義變量時(shí)不必聲明其類型。但這并不意味著變量沒(méi)有類型。一個(gè)變量可以屬于幾種類型之一,這取決于其包含的數(shù)據(jù)。JavaScript中有三種原始類型:...
摘要:網(wǎng)頁(yè)源碼解析智聯(lián)招聘搜索列表一開(kāi)始必須要解析智聯(lián)招聘搜索列表頁(yè),從這里更方便實(shí)現(xiàn)各種深層級(jí)數(shù)據(jù)抓取。顯示不同源碼也不同,盡量選列表模式,源碼更好解析。 網(wǎng)頁(yè)源碼解析 - 智聯(lián)招聘搜索列表 一開(kāi)始必須要解析智聯(lián)招聘搜索列表頁(yè),從這里更方便實(shí)現(xiàn)各種深層級(jí)數(shù)據(jù)抓取。網(wǎng)頁(yè)地址是:http://sou.zhaopin.com/jobs/searchresult.ashx 搜索參數(shù) 智聯(lián)招聘的服務(wù)...
摘要:今天還是繼續(xù)說(shuō)說(shuō)項(xiàng)目今天主要說(shuō)說(shuō)支付寶訂單查詢接口。直接上支付寶訂單查詢的代碼。微信的訂單查詢與此類似。請(qǐng)求后,程序會(huì)向支付寶進(jìn)行查詢。 payment 項(xiàng)目2.0版本 巴西奧運(yùn)會(huì)來(lái)了,剛好我又是做體育行業(yè)的互聯(lián)網(wǎng)。哎!這個(gè)月又要加班成狗了。最近遇到好多莫名其妙的問(wèn)題,待我忙完這段,再跟大家分享下。今天還是繼續(xù)說(shuō)說(shuō) Payment項(xiàng)目今天主要說(shuō)說(shuō)支付寶訂單查詢接口。 接口調(diào)用 廢話廢...
閱讀 1081·2021-11-25 09:43
閱讀 2357·2019-08-30 15:55
閱讀 3231·2019-08-30 15:44
閱讀 2120·2019-08-29 16:20
閱讀 1509·2019-08-29 12:12
閱讀 1673·2019-08-26 12:19
閱讀 2353·2019-08-26 11:49
閱讀 1766·2019-08-26 11:42