日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

分布式唯一ID生成器

發布時間:2024/9/15 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分布式唯一ID生成器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在應用程序中,經常需要全局唯一的ID作為數據庫主鍵。如何生成全局唯一ID?

首先,需要確定全局唯一ID是整型還是字符串?如果是字符串,那么現有的UUID就完全滿足需求,不需要額外的工作。缺點是字符串作為ID占用空間大,索引效率比整型低。

如果采用整型作為ID,那么首先排除掉32位int類型,因為范圍太小,必須使用64位long型。

采用整型作為ID時,如何生成自增、全局唯一且不重復的ID?

方案一:利用數據庫的自增ID,從1開始,基本可以做到連續遞增。Oracle可以用SEQUENCE,MySQL可以用主鍵的AUTO_INCREMENT,雖然不能保證全局唯一,但每個表唯一,也基本滿足需求。

數據庫自增ID的缺點是數據在插入前,無法獲得ID。數據在插入后,獲取的ID雖然是唯一的,但一定要等到事務提交后,ID才算是有效的。有些雙向引用的數據,不得不插入后再做一次更新,比較麻煩。

第二種方式是采用一個集中式ID生成器,它可以是Redis,也可以是ZooKeeper,也可以利用數據庫的表記錄最后分配的ID。

這種方式最大的缺點是復雜性太高,需要嚴重依賴第三方服務,而且代碼配置繁瑣。一般來說,越是復雜的方案,越不可靠,并且測試越痛苦。

第三種方式是類似Twitter的Snowflake算法,它給每臺機器分配一個唯一標識,然后通過時間戳+標識+自增實現全局唯一ID。這種方式好處在于ID生成算法完全是一個無狀態機,無網絡調用,高效可靠。缺點是如果唯一標識有重復,會造成ID沖突。

Snowflake算法采用41bit毫秒時間戳,加上10bit機器ID,加上12bit序列號,理論上最多支持1024臺機器每秒生成4096000個序列號,對于Twitter的規模來說夠用了。

但是對于絕大部分普通應用程序來說,根本不需要每秒超過400萬的ID,機器數量也達不到1024臺,所以,我們可以改進一下,使用更短的ID生成方式:

53bitID由32bit秒級時間戳+16bit自增+5bit機器標識組成,累積32臺機器,每秒可以生成6.5萬個序列號,核心代碼:

private static synchronized long nextId(long epochSecond) {if (epochSecond < lastEpoch) {// warning: clock is turn back:logger.warn("clock is back: " + epochSecond + " from previous:" + lastEpoch);epochSecond = lastEpoch;}if (lastEpoch != epochSecond) {lastEpoch = epochSecond;reset();}offset++;long next = offset & MAX_NEXT;if (next == 0) {logger.warn("maximum id reached in 1 second in epoch: " + epochSecond);return nextId(epochSecond + 1);}return generateId(epochSecond, next, SHARD_ID); }

時間戳減去一個固定值,此方案最高可支持到2106年。

如果每秒6.5萬個序列號不夠怎么辦?沒關系,可以繼續遞增時間戳,向前“借”下一秒的6.5萬個序列號。

同時還解決了時間回撥的問題。

機器標識采用簡單的主機名方案,只要主機名符合host-1,host-2就可以自動提取機器標識,無需配置。

最后,為什么采用最多53位整型,而不是64位整型?這是因為考慮到大部分應用程序是Web應用,如果要和JavaScript打交道,由于JavaScript支持的最大整型就是53位,超過這個位數,JavaScript將丟失精度。因此,使用53位整數可以直接由JavaScript讀取,而超過53位時,就必須轉換成字符串才能保證JavaScript處理正確,這會給API接口帶來額外的復雜度。這也是為什么新浪微博的API接口會同時返回id和idstr的原因。

轉自:廖雪峰的網站

總結

以上是生活随笔為你收集整理的分布式唯一ID生成器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。