亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go雪花算法的作用領(lǐng)域及實(shí)現(xiàn)方法示例

 更新時(shí)間:2023年10月24日 11:52:18   作者:楓瀟瀟兮  
這篇文章主要為大家介紹了Go雪花算法的作用領(lǐng)域及實(shí)現(xiàn)方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

什么是雪花算法

雪花算法(Snowflake)是Twitter開(kāi)源的一種分布式系統(tǒng)唯一ID生成策略,其核心思想是利用41位作為毫秒數(shù),5位作為數(shù)據(jù)中心的ID,5位作為機(jī)器ID,12位作為毫秒內(nèi)的序列號(hào),這樣可以保證每毫秒內(nèi)可以產(chǎn)生多達(dá)4096個(gè)ID,整個(gè)結(jié)構(gòu)如下:1位標(biāo)識(shí)位 + 時(shí)間戳41位 + 數(shù)據(jù)中心5位 + 機(jī)器5位 + 序列號(hào)12位。這種算法可以保證全局唯一性。

雪花算法的作用領(lǐng)域

雪花算法主要用于分布式系統(tǒng)或大型并發(fā)系統(tǒng)中,為了解決全局唯一標(biāo)識(shí)符(ID)的生成問(wèn)題。這些領(lǐng)域包括但不限于:

  • 訂單號(hào)生成系統(tǒng)
  • 數(shù)據(jù)庫(kù)的主鍵生成
  • 分布式緩存中的key生成
  • 分布式系統(tǒng)中數(shù)據(jù)的唯一性確認(rèn)
  • 在大型互聯(lián)網(wǎng)或者中型軟件系統(tǒng)中,生成全局唯一ID的場(chǎng)景等。

Go如何實(shí)現(xiàn)雪花算法

方式一:引入三方庫(kù)

 引入包

go get -u github.com/bwmarrin/snowflake

 實(shí)現(xiàn)代碼

package main
import (
  "fmt"
  "github.com/bwmarrin/snowflake"
)
func main() {
  node, err := snowflake.NewNode(1)
  if err != nil {
    fmt.Println(err)
    return
  }
  id := node.Generate()
  fmt.Println(id)
}

這個(gè)例子先創(chuàng)建了一個(gè)snowflake節(jié)點(diǎn),然后生成一個(gè)ID。

注意:這個(gè)庫(kù)所用的雪花算法有些許與原始算法對(duì)位寬的分配有所不同,Twitter版本是 1位標(biāo)識(shí) + 時(shí)間戳41位 + 數(shù)據(jù)中心5位 + 機(jī)器5位 + 序列號(hào)12位。而bwmarrin庫(kù)版本是 snowflake.NodeBits=10,snowflake.StepBits=12,即數(shù)據(jù)中心和機(jī)器ID共占10位,序列號(hào)占12位。

方式二:實(shí)現(xiàn)源碼

package main
import (
  "fmt"
  "sync"
  "time"
)
const (
  epoch     int64 = 1526285084378           // 設(shè)置起始時(shí)間(這里一般是項(xiàng)目上線時(shí)間)
  timestampBits = uint(41)                  // 時(shí)間戳占41位
  machineBits   = uint(5)                   // 機(jī)器位占5位
  sequenceBits  = uint(12)                  // 序列號(hào)占12位
  machineMax    = int64(-1) ^ (int64(-1) << machineBits)  // 機(jī)器標(biāo)識(shí)最大值
  sequenceMask  = int64(-1) ^ (int64(-1) << sequenceBits) // 序列號(hào)最大值
  machineShift  = sequenceBits              // 機(jī)器碼左移位數(shù)
  timestampShift = machineBits + sequenceBits // 時(shí)間戳左移位數(shù)
)
var (
  machineID  int64
  sequence   int64
  lastTimestamp int64
  lock sync.Mutex
)
func NextID() int64 {
  lock.Lock()
  defer lock.Unlock()
  timestamp := time.Now().UnixNano() / int64(time.Millisecond)
  if timestamp < lastTimestamp {
    panic("invalid timestamp")
  }
  if timestamp == lastTimestamp {
    sequence = (sequence + 1) & sequenceMask
    if sequence == 0 {
      timestamp = waitNextMillisecond(lastTimestamp)
    }
  } else {
    sequence = 0
  }
  lastTimestamp = timestamp
  return ((timestamp - epoch) << timestampShift) | (machineID << machineShift) | sequence
}
func waitNextMillisecond(last int64) int64 {
  timestamp := time.Now().UnixNano() / int64(time.Millisecond)
  for timestamp <= last {
    timestamp = time.Now().UnixNano() / int64(time.Millisecond)
  }
  return timestamp
}
func main() {
  fmt.Println(NextID())
}

注意,這只是一個(gè)簡(jiǎn)化版的雪花算法。在生產(chǎn)環(huán)境中,你需要處理亂序和時(shí)鐘回?fù)軉?wèn)題,以及考慮數(shù)據(jù)中心和機(jī)器標(biāo)識(shí)的生成問(wèn)題。此外,epoch時(shí)間需要你自己設(shè)定,一般設(shè)置為系統(tǒng)上線的時(shí)間。

以上就是Go雪花算法的作用領(lǐng)域及實(shí)現(xiàn)方法示例的詳細(xì)內(nèi)容,更多關(guān)于Go 雪花算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang 刪除切片的某個(gè)元素及剔除切片內(nèi)的零值方式

    golang 刪除切片的某個(gè)元素及剔除切片內(nèi)的零值方式

    這篇文章主要介紹了golang 刪除切片的某個(gè)元素及剔除切片內(nèi)的零值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • 淺析Go語(yǔ)言中的緩沖區(qū)及其在fmt包中的應(yīng)用

    淺析Go語(yǔ)言中的緩沖區(qū)及其在fmt包中的應(yīng)用

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中的緩沖區(qū)及其在fmt包中的應(yīng)用的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2024-01-01
  • go常用指令之go?mod詳解

    go常用指令之go?mod詳解

    當(dāng)go命令運(yùn)行時(shí),它查找當(dāng)前目錄然后查找相繼的父目錄來(lái)找出 go.mod,下面這篇文章主要給大家介紹了關(guān)于go常用指令之go?mod的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • go語(yǔ)言規(guī)范RESTful?API業(yè)務(wù)錯(cuò)誤處理

    go語(yǔ)言規(guī)范RESTful?API業(yè)務(wù)錯(cuò)誤處理

    這篇文章主要為大家介紹了go語(yǔ)言規(guī)范RESTful?API業(yè)務(wù)錯(cuò)誤處理方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Go語(yǔ)言入門(mén)13之runtime包案例講解

    Go語(yǔ)言入門(mén)13之runtime包案例講解

    這篇文章主要介紹了Go語(yǔ)言入門(mén)runtime包相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • GO語(yǔ)言ini配置文件的讀取的操作

    GO語(yǔ)言ini配置文件的讀取的操作

    這篇文章主要介紹了GO語(yǔ)言ini配置文件的讀取的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • GPT回答:go語(yǔ)言和C語(yǔ)言切片對(duì)比

    GPT回答:go語(yǔ)言和C語(yǔ)言切片對(duì)比

    這篇文章主要為大家介紹了GPT回答:go語(yǔ)言和C語(yǔ)言切片對(duì)比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 深入理解Golang中的dig包管理和解決依賴關(guān)系

    深入理解Golang中的dig包管理和解決依賴關(guān)系

    這篇文章主要為大家詳細(xì)介紹了golang中dig包的使用方法,探討其應(yīng)用場(chǎng)景,并提供一些示例,展示如何結(jié)合其他庫(kù)來(lái)更好地實(shí)現(xiàn)這些場(chǎng)景,感興趣的小伙伴可以了解下
    2024-01-01
  • go語(yǔ)言 xorm框架 postgresql 的用法及詳細(xì)注解

    go語(yǔ)言 xorm框架 postgresql 的用法及詳細(xì)注解

    這篇文章主要介紹了go語(yǔ)言 xorm框架 postgresql 的用法及詳細(xì)注解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Golang中sync.Mutex的源碼分析

    Golang中sync.Mutex的源碼分析

    這篇文章將帶大家從源碼分析一下Golang中sync.Mutex的使用,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Golang有一定的幫助,需要的可以參考一下
    2023-03-03

最新評(píng)論