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