業務ID 生成策略,從技術上說,基本要藉助一個集中式的引擎來幫忙實現。redis
爲了擴大業務ID生成策略的併發問題,還有更爲技巧性的提高。網絡
先來介紹廣泛的分佈式ID生成策略:數據結構
1. 利用DB的自增主鍵併發
這裏又有兩種作法,一種是 單首創建一個只有自增主鍵的表,來負責主鍵自增,業務表從這裏取得自增的主鍵返回給業務主鍵生成組件使用。分佈式
另一種: 業務中不使用DB的自增主鍵, 自增主鍵僅存在DB層面,並增長業務主鍵字段,並加以約束。這種比較常見。優化
一般的步驟爲: spa
A. Create table `tbl_biz_order`( `id` bigint auto_increment primary key NOT NULL, `biz_order` bigint NULL, key `biz_order_idx`(`biz_order`) ); B. insert into `tbl_biz_order` (); select last_insert_key(); C. 應用層拿到 id 字段的值,進行一系列拼接。根據規則,生成biz_order。 D. update `tbl_biz_order` set `biz_order`=${biz_order} where id=${id};
時序圖說明這件事情可能更好
2. 利用redis 等生成局部業務IDcode
在防止衝突這裏,基本上能夠使用一些方法進行優化,通常來講,基本上使用redis 的list 數據結構。對象
好比redis 的list 對象預存 100000 序列號,而後進程去lpop。blog
問題在於redis 要考慮網絡不穩定,以及故障恢復後的應用層面要考慮兼容。
3. 機器本地生成
內存中維持計數器,如全局的automaticInteger 這種生成方式。
在分佈式狀況可能有問題