日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

聊一聊雪花算法與分布式ID生成

來源: 責(zé)編: 時(shí)間:2023-12-12 17:02:47 235觀看
導(dǎo)讀生成全局唯一ID的雪花算法原理雪花算法是一種用于生成全局唯一ID的算法,最初由Twitter開發(fā),用于解決分布式系統(tǒng)中生成ID的問題。其核心思想是將一個(gè)64位的長整型ID劃分成多個(gè)部分,每個(gè)部分用于表示不同的信息,確保了生成

生成全局唯一ID的雪花算法原理

雪花算法是一種用于生成全局唯一ID的算法,最初由Twitter開發(fā),用于解決分布式系統(tǒng)中生成ID的問題。其核心思想是將一個(gè)64位的長整型ID劃分成多個(gè)部分,每個(gè)部分用于表示不同的信息,確保了生成的ID在分布式環(huán)境下的唯一性。Qez28資訊網(wǎng)——每日最新資訊28at.com

ID結(jié)構(gòu)

  1. 符號(hào)位(1位):始終為0,用于保證ID為正數(shù)。
  2. 時(shí)間戳(41位):表示生成ID的時(shí)間戳,精確到毫秒級(jí)。
  3. 工作節(jié)點(diǎn)ID(10位):表示生成ID的機(jī)器的唯一標(biāo)識(shí)。
  4. 序列號(hào)(12位):表示在同一毫秒內(nèi)生成的多個(gè)ID的序列號(hào)。

生成步驟

  1. 獲取當(dāng)前時(shí)間戳,精確到毫秒級(jí)。
  2. 如果當(dāng)前時(shí)間小于上次生成ID的時(shí)間,或者在同一毫秒內(nèi)生成的ID數(shù)量超過最大值,等待下一毫秒再繼續(xù)生成。
  3. 如果當(dāng)前時(shí)間等于上次生成ID的時(shí)間,序列號(hào)自增1。
  4. 如果當(dāng)前時(shí)間大于上次生成ID的時(shí)間,序列號(hào)重新從0開始。
  5. 將各個(gè)部分的值組合,得到最終的64位ID。

Go實(shí)現(xiàn)雪花算法的高并發(fā)ID生成器

package mainimport ( "fmt" "sync" "time")const ( workerBits     = 10 sequenceBits   = 12 workerMax      = -1 ^ (-1 << workerBits) sequenceMask   = -1 ^ (-1 << sequenceBits) timeShift      = workerBits + sequenceBits workerShift    = sequenceBits epoch          = 1609459200000)type Snowflake struct { mu          sync.Mutex lastTime    int64 workerID    int64 sequence    int64}func NewSnowflake(workerID int64) *Snowflake { if workerID < 0 || workerID > workerMax {  panic(fmt.Sprintf("worker ID must be between 0 and %d", workerMax)) } return &Snowflake{  lastTime: time.Now().UnixNano() / 1e6,  workerID: workerID,  sequence: 0, }}func (sf *Snowflake) NextID() int64 { sf.mu.Lock() defer sf.mu.Unlock() currentTime := time.Now().UnixNano() / 1e6 if currentTime < sf.lastTime {  panic(fmt.Sprintf("clock moved backwards, refusing to generate ID for %d milliseconds", sf.lastTime-currentTime)) } if currentTime == sf.lastTime {  sf.sequence = (sf.sequence + 1) & sequenceMask  if sf.sequence == 0 {   for currentTime <= sf.lastTime {    currentTime = time.Now().UnixNano() / 1e6   }  } } else {  sf.sequence = 0 } sf.lastTime = currentTime id := (currentTime-epoch)<<timeShift | (sf.workerID << workerShift) | sf.sequence return id}func main() { sf := NewSnowflake(1) // 假設(shè)工作節(jié)點(diǎn)ID為1 for i := 0; i < 10; i++ {  id := sf.NextID()  fmt.Println(id)  time.Sleep(time.Millisecond) }}

高并發(fā)下的唯一性和遞增性保障

在高并發(fā)場景下,保障雪花算法生成的ID唯一性和遞增性的關(guān)鍵在于:Qez28資訊網(wǎng)——每日最新資訊28at.com

  1. 唯一性: 工作節(jié)點(diǎn)ID的設(shè)置保證了不同節(jié)點(diǎn)生成的ID不會(huì)沖突。序列號(hào)的自增和位運(yùn)算保證了同一毫秒內(nèi)生成的ID唯一。
  2. 遞增性: 在同一毫秒內(nèi)生成的多個(gè)ID按序列號(hào)的遞增順序排列。即使在極端情況下,同一毫秒內(nèi)生成的ID數(shù)量超過了最大值,會(huì)等待下一毫秒重新開始,也保證了遞增性。

總體來說,雪花算法在高并發(fā)下是一個(gè)可靠的ID生成方案。它的高性能和低碰撞概率使得它在分布式系統(tǒng)中被廣泛應(yīng)用。Qez28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-43328-0.html聊一聊雪花算法與分布式ID生成

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 深入解析HTML的&lt;a&gt;標(biāo)簽

下一篇: Matplotlib中的titles(標(biāo)題)、labels(標(biāo)簽)和legends(圖例)

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 涪陵区| 桂阳县| 神池县| 西乌珠穆沁旗| 伊通| 祁连县| 杭州市| 台湾省| 本溪| 嘉善县| 安阳市| SHOW| 鹤壁市| 斗六市| 延吉市| 辽阳县| 大渡口区| 南靖县| 恩平市| 城口县| 麻城市| 遂平县| 利辛县| 喜德县| 明溪县| 铜川市| 会泽县| 板桥市| 泰和县| 奉贤区| 迁西县| 葫芦岛市| 双牌县| 甘南县| 漯河市| 景洪市| 龙泉市| 永登县| 西平县| 惠州市| 桑植县|