分布式序列號(流水號)生成

序列號要素

唯一性

生成的序列號需要全局唯一跷睦。這個唯一也不是絕對的缚够,因為首先要理解全局的概念娶聘,全局可以理解為一種業(yè)務(wù)范圍煮剧,比如說訂單生成斥滤,也可以到數(shù)據(jù)庫表一級(因為業(yè)務(wù)建模最終會在表結(jié)構(gòu)進行體現(xiàn))。也要考慮到分表情況勉盅,一張訂單表可能分為多張訂單表并存在不同的分布式數(shù)據(jù)庫中佑颇,那序列號也必須保證唯一。

支持高可用草娜,高并發(fā)

出現(xiàn)不可用的情況后挑胸,必然影響業(yè)務(wù)進件,并發(fā)量支持不高的話宰闰,也無法適應高頻場景茬贵。

有序

由于序列號大多為數(shù)據(jù)庫表主鍵,也是查詢的關(guān)鍵字段移袍,保證有序解藻,可方便查詢。

業(yè)務(wù)意義

序列號生成后不能是一堆有序的亂糟糟的數(shù)字字母組合葡盗,它必須要體現(xiàn)出一定的業(yè)務(wù)或者時間意義舆逃。這樣可以一目了然找到這筆業(yè)務(wù)的實際業(yè)務(wù)場景或者發(fā)生時間,并且方便范圍查詢。但是要保證每段序列號分配路狮,比如說前幾位代表什么虫啥,后幾位是什么意義。
舉例說明:[業(yè)務(wù)相關(guān)字典項A]+[業(yè)務(wù)相關(guān)字典項B]+[業(yè)務(wù)相關(guān)字典項C]+...+[時間]+[分段遞增]奄妨,這樣可以根據(jù)不同業(yè)務(wù)選項進行l(wèi)ike查詢(這種%在右邊的like查詢是會走索引的)涂籽。

生成方法

網(wǎng)上有很多的生成方法,我這只是展示我們公司使用的方式砸抛,并指出優(yōu)缺點评雌。其實流水號前幾位已經(jīng)是固定的了,因為業(yè)務(wù)相關(guān)分段號和發(fā)生時間分段號在業(yè)務(wù)進件的時候便已知直焙,那么我們需要生成的便是最后后幾位景东。

UUID

最差的id生成方法,它只能滿足唯一性奔誓,對業(yè)務(wù)不友好斤吐,對數(shù)據(jù)庫不友好,我覺得它只能作為接口間傳遞的接口流水號厨喂,可以定位接口日志和措。我們也是這么用的。

數(shù)據(jù)庫

獨立數(shù)據(jù)庫蜕煌,就是說我們有一臺數(shù)據(jù)庫派阱,專門用于生成自增id,由于是單庫斜纪,所以可用性不能保證贫母,性能也有瓶頸。但是優(yōu)勢是結(jié)構(gòu)簡單盒刚,維護容易颁独,對于并發(fā)量不高的業(yè)務(wù)場景是可以使用的。
oracle可以使用sequence伪冰,mysql需要獨立建一張表誓酒,并寫一個函數(shù)用于獲取id,伸手拉一個實現(xiàn)方案如下:
建表語句

CREATE TABLE SEQUENCE_ID (
    id bigint(20) unsigned NOT NULL auto_increment, 
    stub char(10) NOT NULL default '',
    PRIMARY KEY (id),
    UNIQUE KEY stub (stub)
);

存儲過程

begin;
replace into SEQUENCE_ID (stub) VALUES ('anyword');
select last_insert_id();
commit;

其實贮聂,滴滴有一個開源的基于數(shù)據(jù)庫和segment(分段)模式的id生成器tinyid靠柑。可以白嫖吓懈,可用性要比上面的方式高(因為應用會將一部分序列號預存到內(nèi)存中歼冰,即使數(shù)據(jù)庫宕機也可使用),具體使用方式可以去github上觀摩一下https://github.com/didi/tinyid耻警。

Redis

跟數(shù)據(jù)庫差不多的特點隔嫡,只不過比數(shù)據(jù)庫要快甸怕,核心是incr和incrby兩個命令。但要開啟持久化AOF腮恩,宕機后可以恢復梢杭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市秸滴,隨后出現(xiàn)的幾起案子武契,更是在濱河造成了極大的恐慌,老刑警劉巖荡含,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咒唆,死亡現(xiàn)場離奇詭異,居然都是意外死亡释液,警方通過查閱死者的電腦和手機全释,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來误债,“玉大人浸船,你說我怎么就攤上這事≌仪埃” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵判族,是天一觀的道長躺盛。 經(jīng)常有香客問我,道長形帮,這世上最難降的妖魔是什么槽惫? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮辩撑,結(jié)果婚禮上界斜,老公的妹妹穿的比我還像新娘。我一直安慰自己合冀,他們只是感情好各薇,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著君躺,像睡著了一般峭判。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棕叫,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天林螃,我揣著相機與錄音,去河邊找鬼俺泣。 笑死疗认,一個胖子當著我的面吹牛完残,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播横漏,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼谨设,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了绊茧?” 一聲冷哼從身側(cè)響起铝宵,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎华畏,沒想到半個月后鹏秋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡亡笑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年侣夷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仑乌。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡百拓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晰甚,到底是詐尸還是另有隱情衙传,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布厕九,位于F島的核電站蓖捶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扁远。R本人自食惡果不足惜俊鱼,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望畅买。 院中可真熱鬧并闲,春花似錦、人聲如沸谷羞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽湃缎。三九已至购公,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雁歌,已是汗流浹背宏浩。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留靠瞎,地道東北人比庄。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓求妹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親佳窑。 傳聞我的和親對象是個殘疾皇子制恍,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

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

  • 轉(zhuǎn)載:細聊分布式ID生成方法 一、需求緣起 幾乎所有的業(yè)務(wù)系統(tǒng)神凑,都有生成一個記錄標識的需求净神,例如: (1)消息標識...
    meng_philip123閱讀 2,567評論 0 17
  • 全局唯一的 ID 幾乎是所有系統(tǒng)都會遇到的剛需。這個 id 在搜索, 存儲數(shù)據(jù), 加快檢索速度 等等很多方面都有著...
    高級java架構(gòu)師閱讀 824評論 0 6
  • --- layout: post title: "如果有人問你關(guān)系型數(shù)據(jù)庫的原理溉委,叫他看這篇文章(轉(zhuǎn))" date...
    藍墜星閱讀 793評論 0 3
  • 你個憨批 做大做強鹃唯,再創(chuàng)輝煌
    祁小五閱讀 274評論 0 0