高并發(fā)下如何生成唯一ID

通過本文檔你將學習到

  • 為什么需要分布式全局唯一ID以及分布式ID的業(yè)務需求 ?
  • ID生成規(guī)則部分硬性要求暂雹?目標出現(xiàn)了渣磷,就知道我們該怎么做了向楼。
  • ID號生成系統(tǒng)的可用性要求
  • 一般通用方案田炭,大部分我們都是怎么玩這個唯一ID的师抄?
  • 王者玩家怎么玩的?

1 為什么需要唯一ID

復雜的分布式西戎中教硫,需要大量的數(shù)據(jù)和消息進行唯一標識叨吮,訂單號,用戶UID等等瞬矩,你需要一個全局的唯一的ID茶鉴。

2 要求

2.1 生成規(guī)則的硬性要求:

  • 全局唯一
    不能出現(xiàn)重復的ID號,既然是唯一標識,這是最基本的要求
  • 趨勢遞增
    在MySQL的innoDB引擎中使用的是聚集索引,由于多數(shù)RDBMS使用Btree的數(shù)據(jù)結(jié)構(gòu)來存儲索引數(shù)據(jù),在主鍵的選擇上面我們應該盡量使用有序的主鍵保證寫入性能。
  • 單調(diào)遞增
    保證下一個ID大于上一個ID,丧鸯。為什么蛤铜? 這個可以參考InnoDB存儲引擎的特點,

關(guān)于mysql的數(shù)據(jù)底層是怎么保存數(shù)據(jù)的丛肢,B+樹又是什么?可以自己去查看《mysql必知必會》+《MySQL技術(shù)內(nèi)幕:InnoDB存儲引擎》 + 極客時間 mysql實戰(zhàn)45
《數(shù)據(jù)結(jié)構(gòu)與算法》詳細解釋了什么二三樹 AVL樹 b+樹等等
如果不怎么熟悉mysql,一上去就看經(jīng)典《高性能mysql》你會一臉懵逼剿干。

  • 信息安全
    如果ID是連續(xù)的,惡意用戶的扒取工作就非常容易做了,直接按照順序下載指定URL即可 所以在一些應用場景下,需要ID無規(guī)則 不規(guī)則,讓競爭對手不好猜
  • 含時間戳
    這樣就能在開發(fā)中快速了解分布式id的生成時間

2.2 生成系統(tǒng)的可用性要求:

  • 高可用
    發(fā)一個獲取分布式ID的請求,服務器就要保證99.999%的情況下給我創(chuàng)建一個唯一分布式ID
  • 低延遲
    發(fā)一個獲取分布式ID的請求,服務器就要快,極速
  • 高QPS:10萬個的請求同時過來蜂怎。
    假如并發(fā)一口氣創(chuàng)建分布式ID請求同時殺過來,服務器要頂?shù)米∏乙幌伦映晒?chuàng)建10萬

3常用的幾種方案

你不要一上來就扯用雪花算法,然后分享結(jié)束置尔。這就是在扯杠步。當別人問題用什么,你只能回答看業(yè)務需求榜轿。假如一個項目只有100個用戶幽歼,你說生成UID,用雪花算法谬盐。需要么甸私?直接DB自增不就可以了么?

UUID
如果只考慮唯一性,OK 入數(shù)據(jù)庫性能差飞傀?為什么差還得看那幾本書皇型。
數(shù)據(jù)庫自增主鍵
不解釋了诬烹,低延遲什么高QPS 搞不定,

基于redis生成全局id策略 我們項目種使用的好像就是這個
單機:因為Redis是單線的天生保證原子性,可以使用原子操作INCR和INCRBY來實現(xiàn)


集群

王者
Twitter的分布式自增ID算法snowflake


snowflake
snowflake
snowflake

snowflake

具體時間


具體時間

雪花算法java源碼

http://www.reibang.com/p/2a27fbd9e71a

工作種就是把源碼粘貼一下封裝下直接用么弃鸦?不好意思绞吁,你想到到別人都想到了,直接有封裝好的工具包 maven引入搞起唬格。

糊涂工具包 就是我們每個工程里面都有一些untils包家破,這個maven引入,幾乎你想到的都有购岗。

https://hutool.cn/

https://github.com/looly/hutool

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-captcha</artifactId>
    <version>5.2.0</version>
</dependency>

核心代碼IdGeneratorSnowflake

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汰聋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子藕畔,更是在濱河造成了極大的恐慌马僻,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件注服,死亡現(xiàn)場離奇詭異韭邓,居然都是意外死亡,警方通過查閱死者的電腦和手機溶弟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門女淑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辜御,你說我怎么就攤上這事鸭你。” “怎么了擒权?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵袱巨,是天一觀的道長。 經(jīng)常有香客問我碳抄,道長愉老,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任剖效,我火速辦了婚禮嫉入,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘璧尸。我一直安慰自己咒林,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布爷光。 她就那樣靜靜地躺著垫竞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瞎颗。 梳的紋絲不亂的頭發(fā)上件甥,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天捌议,我揣著相機與錄音,去河邊找鬼引有。 笑死瓣颅,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的譬正。 我是一名探鬼主播宫补,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼曾我!你這毒婦竟也來了粉怕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤抒巢,失蹤者是張志新(化名)和其女友劉穎贫贝,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛉谜,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡稚晚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了型诚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片客燕。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖狰贯,靈堂內(nèi)的尸體忽然破棺而出也搓,到底是詐尸還是另有隱情,我是刑警寧澤涵紊,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布傍妒,位于F島的核電站,受9級特大地震影響摸柄,放射性物質(zhì)發(fā)生泄漏拍顷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一塘幅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尿贫,春花似錦电媳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至又谋,卻和暖如春拼缝,著一層夾襖步出監(jiān)牢的瞬間娱局,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工咧七, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留衰齐,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓继阻,卻偏偏與公主長得像耻涛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瘟檩,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容