如何實現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配置有些麻煩,程式碼量多。
如果大家有更好的方式方法,歡迎大家留言評論,一起進步。