成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > Go語言實現Snowflake雪花算法

Go語言實現Snowflake雪花算法

熱門標簽:如何利用高德地圖標注家 電腦外呼系統輻射大嗎 智能語音電銷的機器人 400手機電話免費辦理 揚州電銷外呼系統軟件 武漢百應人工智能電銷機器人 開通400電話申請流程 上海企業(yè)外呼系統排名 百度地圖標注位置網站

每次放長假的在家里的時候,總想找點簡單的例子來看看實現原理,這次我們來看看 Go 語言雪花算法。

介紹

有時候在業(yè)務中,需要使用一些唯一的ID,來記錄我們某個數據的標識。最常用的無非以下幾種:UUID、數據庫自增主鍵、Redis的Incr命令等方法來獲取一個唯一的值。下面我們分別說一下它們的優(yōu)劣,以便引出我們的分布式雪花算法。

雪花算法

雪花算法的原始版本是scala版,用于生成分布式ID(純數字,時間順序),訂單編號等。

自增ID:對于數據敏感場景不宜使用,且不適合于分布式場景。 GUID:采用無意義字符串,數據量增大時造成訪問過慢,且不宜排序。

UUID

首先是 UUID ,它是由128位二進制組成,一般轉換成十六進制,然后用String表示。為了保證 UUID 的唯一性,規(guī)范定義了包括網卡MAC地址、時間戳、名字空(Namespace)、隨機或偽隨機數、時序等元素,以及從這些元素生成 UUID 的算法。

UUID 有五個版本:

  • 版本1:基于時間戳和mac地址
  • 版本2:基于時間戳,mac地址和POSIX UID/GID
  • 版本3:基于MD5哈希算法
  • 版本4:基于隨機數
  • 版本5:基于SHA-1哈希算法

UUID 的優(yōu)缺點:

優(yōu)點是代碼簡單,性能比較好。缺點是沒有排序,無法保證按序遞增;其次是太長了,存儲數據庫占用空間比較大,不利于檢索和排序。

數據庫自增主鍵

如果是使用 mysql 數據庫,那么通過設置主鍵為 auto_increment 是最容易實現單調遞增的唯一ID 的方法,并且它也方便排序和索引。

但是缺點也很明顯,由于過度依賴數據庫,那么受限于數據庫的性能會導致并發(fā)性并不高;再來就是如果數據量太大那么會給分庫分表會帶來問題;并且如果數據庫宕機了,那么這個功能是無法使用的。

Redis

Redis 目前已在很多項目中是一個不可或缺的存在,在 Redis 中有兩個命令 Incr、IncrBy ,因為Redis是單線程的所以通過這兩個指令可以能保證原子性從而達到生成唯一值的目標,并且性能也很好。

但是在 Redis 中,即使有 AOF 和 RDB ,但是依然會存在數據丟失,有可能會造成ID重復;再來就是需要依賴 Redis ,如果它不穩(wěn)定,那么會影響 ID 生成。

Snowflake

通過上面的一個個分析,終于引出了我們的分布式雪花算法 Snowflake ,它最早是twitter內部使用的分布式環(huán)境下的唯一ID生成算法。在2014年開源。開源的版本由scala編寫,大家可以再找個地址找到這版本。

https://github.com/twitter-archive/snowflake/tags

它有以下幾個特點:

  • 能滿足高并發(fā)分布式系統環(huán)境下ID不重復;
  • 基于時間戳,可以保證基本有序遞增;
  • 不依賴于第三方的庫或者中間件;

實現原理

Snowflake 結構是一個 64bit 的 int64 類型的數據。如下:

位置 大小 作用
0~11bit 12bits 序列號,用來對同一個毫秒之內產生不同的ID,可記錄4095個
12~21bit 10bits 10bit用來記錄機器ID,總共可以記錄1024臺機器
22~62bit 41bits 用來記錄時間戳,這里可以記錄69年
63bit 1bit 符號位,不做處理

上面只是一個將 64bit 劃分的通用標準,一般的情況可以根據自己的業(yè)務情況進行調整。例如目前業(yè)務只有機器10臺左右預計未來會增加到三位數,并且需要進行多機房部署,QPS 幾年之內會發(fā)展到百萬。

那么對于百萬 QPS 平分到 10 臺機器上就是每臺機器承擔十萬級的請求即可,12 bit 的序列號完全夠用。對于未來會增加到三位數機器,并且需要多機房部署的需求我們僅需要將 10 bits 的 work id 進行拆分,分割 3 bits 來代表機房數共代表可以部署8個機房,其他 7bits 代表機器數代表每個機房可以部署128臺機器。那么數據格式就會如下所示:

代碼實現

實現步驟

其實看懂了上面的數據結構之后,需要自己實現一個雪花算法是非常簡單,步驟大致如下:

  • 獲取當前的毫秒時間戳;
  • 用當前的毫秒時間戳和上次保存的時間戳進行比較;
    • 如果和上次保存的時間戳相等,那么對序列號 sequence 加一;
    • 如果不相等,那么直接設置 sequence 為 0 即可;
  • 然后通過或運算拼接雪花算法需要返回的 int64 返回值。

代碼實現

首先我們需要定義一個 Snowflake 結構體:

type Snowflake struct {
 sync.Mutex     // 鎖
 timestamp    int64 // 時間戳 ,毫秒
 workerid     int64  // 工作節(jié)點
 datacenterid int64 // 數據中心機房id
 sequence     int64 // 序列號
}

然后我們需要定義一些常量,方便我們在使用雪花算法的時候進行位運算取值:

const (
  epoch             = int64(1577808000000)                           // 設置起始時間(時間戳/毫秒):2020-01-01 00:00:00,有效期69年
 timestampBits     = uint(41)                                       // 時間戳占用位數
 datacenteridBits  = uint(2)                                        // 數據中心id所占位數
 workeridBits      = uint(7)                                        // 機器id所占位數
 sequenceBits      = uint(12)                                       // 序列所占的位數
 timestampMax      = int64(-1 ^ (-1  timestampBits))              // 時間戳最大值
 datacenteridMax   = int64(-1 ^ (-1  datacenteridBits))           // 支持的最大數據中心id數量
 workeridMax       = int64(-1 ^ (-1  workeridBits))               // 支持的最大機器id數量
 sequenceMask      = int64(-1 ^ (-1  sequenceBits))               // 支持的最大序列id數量
 workeridShift     = sequenceBits                                   // 機器id左移位數
 datacenteridShift = sequenceBits + workeridBits                    // 數據中心id左移位數
 timestampShift    = sequenceBits + workeridBits + datacenteridBits // 時間戳左移位數
)

需要注意的是由于 -1 在二進制上表示是:

11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111

所以想要求得 41bits 的 timestamp 最大值可以將 -1 向左位移 41 位,得到:

11111111 11111111 11111110 00000000 00000000 00000000 00000000 00000000

那么再和 -1 進行 ^異或運算:

00000000 00000000 00000001 11111111 11111111 11111111 11111111 11111111

這就可以表示 41bits 的 timestamp 最大值。datacenteridMax、workeridMax也同理。

接著我們就可以設置一個 NextVal 函數來獲取 Snowflake 返回的 ID 了:

func (s *Snowflake) NextVal() int64 {
 s.Lock()
 now := time.Now().UnixNano() / 1000000 // 轉毫秒
 if s.timestamp == now {
  // 當同一時間戳(精度:毫秒)下多次生成id會增加序列號
  s.sequence = (s.sequence + 1)  sequenceMask
  if s.sequence == 0 {
   // 如果當前序列超出12bit長度,則需要等待下一毫秒
   // 下一毫秒將使用sequence:0
   for now = s.timestamp {
    now = time.Now().UnixNano() / 1000000
   }
  }
 } else {
  // 不同時間戳(精度:毫秒)下直接使用序列號:0
  s.sequence = 0
 }
 t := now - epoch
 if t > timestampMax {
  s.Unlock()
  glog.Errorf("epoch must be between 0 and %d", timestampMax-1)
  return 0
 }
 s.timestamp = now
 r := int64((t)timestampShift | (s.datacenterid  datacenteridShift) | (s.workerid  workeridShift) | (s.sequence))
 s.Unlock()
 return r
}

上面的代碼也是非常的簡單,看看注釋應該也能懂,我這里說說最后返回的 r 系列的位運算表示什么意思。

首先 t 表示的是現在距離 epoch 的時間差,我們 epoch 在初始化的時候設置的是2020-01-01 00:00:00,那么對于 41bit 的 timestamp 來說會在 69 年之后才溢出。對 t 進行向左位移之后,低于 timestampShift 位置上全是0 ,由 datacenterid、workerid、sequence 進行取或填充。

在當前的例子中,如果當前時間是2021/01/01 00:00:00,那么位運算結果如下圖所示:

到此這篇關于Go語言實現Snowflake雪花算法的文章就介紹到這了,更多相關Go語言雪花算法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Java 基于雪花算法生成分布式id
  • mybatis-plus雪花算法自動生成機器id原理及源碼
  • java算法之靜態(tài)內部類實現雪花算法
  • Java實現雪花算法的原理
  • 開源一個c# 新的雪花算法
  • Js Snowflake(雪花算法)生成隨機ID的實現方法
  • 利用mysql實現的雪花算法案例
  • 基于python實現雪花算法過程詳解

標簽:武漢 嘉峪關 延邊 江西 宜賓 張掖 新余 黑龍江

巨人網絡通訊聲明:本文標題《Go語言實現Snowflake雪花算法》,本文關鍵詞  語言,實現,Snowflake,雪花,;如發(fā)現本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Go語言實現Snowflake雪花算法》相關的同類信息!
  • 本頁收集關于Go語言實現Snowflake雪花算法的相關信息資訊供網民參考!
  • 推薦文章
    日韩乱码人妻无码中文字幕久久| 欧美日韩免费网站| aaa欧美日韩| 成人免费在线网址| 九色蝌蚪性视频| jlzzjlzz国产精品久久| 国产亚洲精品成人av久久ww| 加勒比在线日本| 国产精品一区二区在线免费观看| 国产亚洲成av人片在线观看桃| 久久久久久女乱国产| 国内精品久久久久久久久电影网| 欧美亚洲在线| 欧美欧美天天天天操| 猫咪av网站| 久久久成人免费视频| 91精品免费在线观看| **欧美日韩在线观看| 亚洲欧美一二三| 精品久久国产老人久久综合| 玖玖视频精品| 免费在线观看成人| 免费无码毛片一区二三区| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 久久精品国内一区二区三区| 91精品国产乱码久久久久| 中文字幕亚洲电影| 成人国产免费电影| 在线观看一区二区三区三州| 欧美最近摘花xxxx摘花| 成人精品一区| 一级黄色录像免费看| 欧美日韩高清在线| 国产网址在线观看| 国产亚洲一卡2卡3卡4卡新区| 国产视频一区二区三区在线播放| 久久精品国产一区二区三区肥胖| 久久精品视频8| 日本国产精品| 色呦呦免费观看| 亚洲一区二区三区高清不卡| 亚洲欧美色婷婷| 国产精品手机在线观看| 精品国内自产拍在线观看视频| 欧洲视频在线免费观看| 欧洲av一区二区嗯嗯嗯啊| 黑人巨大40厘米重口ysn| 国产午夜在线播放| 日日狠狠久久偷偷四色综合免费| 91精品综合久久久久久久久久久| 91麻豆精品视频| 天堂在线观看一卡二卡三卡四卡| 久久理论电影| av免费在线免费| 99精品视频99| 国产精品免费视频二三区| 国产精品夜夜夜爽张柏芝| 中国一级特黄录像播放| 美女少妇全过程你懂的久久| 精品国产一区二区三区av片| 色av男人的天堂免费在线| 可以直接在线观看的av| 性欧美xxxx免费岛国不卡电影| 久久er视频| 香港一级纯黄大片| 成人欧美一区二区三区在线播放| 国产精品久久久久久久久妇女| 欧美国产日韩精品免费观看| 一级黄色片免费| 99久热re在线精品视频| 日本一级黄视频| 伊人中文在线| 欧美区一区二区三区| 久久国产综合精品| 久久理论电影| 午夜伦理福利在线| 麻豆成全视频免费观看在线看| 国产亚洲亚洲| 国产一区免费电影| 亚洲精品午夜| 国产在线第二页| 色悠悠久久久久| 久久九九电影| 国产精品久久观看| 菠萝蜜影院一区二区免费| 国产人妖ts一区二区| 高清在线观看av| 免费在线黄色片| 日本电影亚洲天堂| 日本在线www| 狠狠躁夜夜躁人人爽天天天天97| 亚洲资源在线看| 在线观看h视频| 性少妇xx生活| 国产对白videos麻豆高潮| 国产国语老龄妇女a片| 亚洲第九十七页| 精品少妇v888av| 国产精品无码久久av| 日本一区精品视频| 成人av手机在线观看| 蜜臀精品一区二区三区| 中文字字幕码一二三区| 综合久久一本| 国产精品一区二区三区视频网站| 久一区二区三区| 懂色一区二区三区av片| 日韩激情视频在线| 日韩精品一区第一页| 69av影院| gogogogo高清视频在线| 4438国产精品一区二区| 久久久久久久久久网站| 99久热re在线精品视频| 黄色大片网站| 中国字幕a在线看韩国电影| 国产婷婷色综合av蜜臀av| 亚洲色图15p| 国产精品theporn| 黄色av免费观看| 久久久免费精品| 欧美精品xxx| 精品二区三区线观看| 久草网站在线观看| 国产成人夜间影院在线观看| 丝瓜app色版网站观看| 欧美激情国产高清| 在线观看免费视频高清游戏推荐| 91麻豆精品国产| 亚洲天堂777| 男人天堂1024| 国产91沈先生在线播放| 日韩免费三级| 色就是色欧美| 欧美大片在线播放| 波多野结衣中文字幕在线播放| 精品在线播放午夜| 日韩在线观看电影完整版高清免费悬疑悬疑| 91肉色超薄丝袜脚交一区二区| 国产成人亚洲精品乱码在线观看| 在线国产视频| 一级黄色片视频| 亚洲人成在线播放网站岛国| 欧美成年人视频网站欧美| 亚洲欧美日韩网站| 免费激情网址| 99久久精品费精品国产一区二区| 少妇一级淫片免费放播放| 美女日韩欧美| 国产韩国精品一区二区三区| 国产女女做受ⅹxx高潮| 亚洲欧美一区二区在线观看| 日韩在线网址| 国产亚洲成年网址在线观看| 色噜噜狠狠永久免费| 国产精品嫩草影视| 国产麻豆a毛片| 精品人妻大屁股白浆无码| 精品一区二三区| 日本高清一区| 欧美 亚欧 日韩视频在线| 久久伊人免费视频| 国产免费播放一区二区| 欧美激情一区二区三区高清视频| 欧美精品一区二区在线观看| 亚洲在线偷拍自拍| 大香伊人久久| 超碰色偷偷男人的天堂| 欧美在线观看不卡| 国产色视频一区二区三区qq号| 91久久偷偷做嫩草影院| 日韩一级高清毛片| 国产精品流白浆视频| 日韩精品电影一区二区| 日韩视频免费观看高清在线视频| 水蜜桃av无码| 久久久久久久久久久人体| 国产精品爽爽爽爽爽爽在线观看| 青青草手机在线| www.黄色网| 久久久久久久久国产一区| 久久久久久久中文| 国产三级精品三级在线专区| 综合久久久久综合| 国卡一卡二卡三免费网站| 欧美日韩在线免费视频| 加勒比在线一区| 亚洲成人精品影院| 欧美又粗又大又爽| 亚洲少妇一区二区| 999久久精品| 午夜精品久久久久| 中文字幕精品视频在线| 欧美一区二区女人| 成人久久久久爱| 最近最好的中文字幕2019免费| 日韩精品亚洲aⅴ在线影院| 精品久久久久一区二区国产| 1234区在线观看视频免费| 国产又粗又硬又长又爽| 国产成人成网站在线播放青青| 亚洲伊人一本大道中文字幕| 国产又粗又猛又黄又爽| 77777_亚洲午夜久久多人| 国产精品一二三区在线观看| 午夜激情视频在线播放| 国产精品资源在线观看| 亚洲国产精品成人综合色在线婷婷| 午夜激情久久| 日韩中文字幕视频在线观看| 国产 欧美 精品| 中文字幕一二三四区| 欧美影院精品| 亚洲欧美日本一区| av在线天堂| 成人日韩在线电影| 亚洲免费中文| а天堂8中文最新版在线官网| 午夜精品视频在线| 激情小说亚洲色图| www日本视频| 悠悠资源av网址| 黄色污网站在线免费观看| 成人在线观看www| 国产精品二区不卡| av中文字幕电影在线看| 欧美高清一级片| 中文字幕网址在线| 精品国产91乱码一区二区三区| 国产在线视频不卡二| 在线国产日本| 国模精品一区二区三区色天香| 88在线观看91蜜桃国自产| 美女的奶胸大爽爽大片| heisi视频网在线观看| 国产伊人精品| 日本天堂网在线观看| 国产一级做a爰片久久| 自产国语精品视频| 丰满人妻一区二区三区四区53| 国产成人综合一区| 国产福利短视频| 操你啦视频在线| 仙踪林久久久久久久999| 久久亚洲综合色一区二区三区| 久久精品99国产| 好爽好深好紧好大| 特级毛片在线观看| 九九视频免费观看| 精品国产美女福利到在线不卡| 亚洲精品一区二区三区新线路| 黄色国产网站在线播放| 625成人欧美午夜电影| 免费看的黄网站| 亚洲国产成人精品激情在线| 在线观看91| 福利欧美精品在线| 久久国产精品国产精品| 麻豆疯狂做受xxxx高潮视频| 久久精品91久久香蕉加勒比| 全国精品免费看| 国产精品入口夜色视频大尺度| 日韩精品极品视频在线观看免费| 视频一区在线| 免费网站看v片在线a| 97久久精品| 四虎影院在线播放| 久久精品偷拍视频| www.av视频| 欧美性猛交xxxx乱大交极品| 久久久国产精品视频| 成人美女视频在线看| 黄色小视频在线看| 国产精品theporn88| 伊人资源视频在线| 亚洲已满18点击进入久久| 97色伦图片97色伦在线电影| 日韩中文字幕在线一区| 国产精品久久一区| 日韩在线你懂得| 国产又色又爽又黄刺激在线视频| aaaaaaa大片免费看| 国产精品丝袜久久久久久高清| 国产欧美一区二区三区国产幕精品| 国产成人精品一区二区三区免费| 欧美做爰猛烈大尺度视频| 噼里啪啦国语在线观看免费版高清版| 黄色片免费观看| 欧美另类交人妖| 午夜免费在线观看精品视频| 日本性爱视频在线观看| 免费成年网站| 天堂8在线天堂资源bt| 国产亚洲成人精品| 独立日3在线观看完整版| 久久精品30| 日韩在线免费高清视频| 亚洲国产激情av| 男人皇宫亚洲男人2020| 在线免费观看a视频| 国产精品69xx| 视频在线一区二区三区| 狠狠色香婷婷久久亚洲精品| 一区二区欧美精品| 亚洲黄色一区二区三区| 国产成人精品一区二区三区四区| wwwxxxx欧美| 国产字幕在线观看| 男人看的污网站| 午夜激情视频在线播放| 男女污污视频在线观看| 日本三级亚洲精品| 成人久久一区二区| 99热成人精品热久久66| 成年人一级黄色片| 国产欧美一区二区在线| 亚洲天堂一区二区在线观看| 欧美第一页浮力影院| 丝袜美腿小色网| 欧美男同性恋视频网站| 亚洲 国产 图片| 久久成年人视频| 国产精品无码电影在线观看| 26uuu另类欧美亚洲曰本| 国产麻豆精品视频| 国产日韩欧美一区二区三区视频| 日韩综合小视频| 黑人精品xxx一区一二区|