1. 程式人生 > >如何實現ID生成不重複?

如何實現ID生成不重複?

如何實現不重複的id生成呢?

這裡還是要推薦下小編的web前端學習q u n:6879+584+61,不管你是小白還是大牛,小編我都歡迎,不定期分享乾貨,包括小編自己整理的一份最新的web前端資料和0基礎入門教程,歡迎初學和進階中的小夥伴。在不忙的時間我會給大家解惑。

以下就是小編為大家整理的方案:

第一個就是UUID

UUID 是指在一臺機器上生成的數字,它保證對在同一時空中的所有機器都是唯一的。通常平臺會提供生成的API。按照開放軟體基金會(OSF)制定的標準計算,用到了乙太網卡地址、納秒級時間、晶片ID碼和許多可能的數字

UUID由以下幾部分的組合:

(1)41位的時間序列(精確到毫秒,41位的長度可以使用69年)

(2)10位的機器標識(10位的長度最多支援部署1024個節點)

(3)12位的計數順序號(12位的計數順序號支援每個節點每毫秒產生4096個ID序號) 最高位是符號位,始終為0。

優點:本地生成,資料庫壓力減輕了

缺點:長度過長,而且還是無序的

第二個就是基於資料庫生成

單獨搞一臺資料庫,

設定自動增長,用於記錄增長值

然後所有id生成都去請求它

優點:簡單,高效

缺點:需要單獨部署,大併發下效能比較低

第三個 Twitter的snowflake演算法

snowflake的結構如下(每部分用-分開):

0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000

第一位為未使用,接下來的41位為毫秒級時間(41位的長度可以使用69年),然後是5位datacenterId和5位workerId(10位的長度最多支援部署1024個節點) ,最後12位是毫秒內的計數(12位的計數順序號支援每個節點每毫秒產生4096個ID序號)

一共加起來剛好64位,為一個Long型。(轉換成字串後長度最多19)

snowflake生成的ID整體上按照時間自增排序,並且整個分散式系統內不會產生ID碰撞(由datacenter和workerId作區分),並且效率較高。經測試snowflake每秒能夠產生26萬個ID。

優點:生成的id是Long型別,遞增

缺點:每臺機器上的時間不一樣,會產生不了遞增的情況

第四個 redis生成id

redis是很好用的快取。

Redis是單執行緒的,所以也可以用生成全域性唯一的ID。

優點:數字ID天然排序,對分頁或者需要排序的結果很有幫助,高併發也行,可以設定Redis叢集來生成。

缺點:redis配置有些麻煩,程式碼量多。

如果大家有更好的方式方法,歡迎大家留言評論,一起進步。