のグローバルにユニークなIDを生成するにはいくつかの方法:
図1に示すように、局所的に生成されたUUID生成グローバルユニークID、シンプル、粗生成モード、いかなるネットワークオーバーヘッド、高効率化が存在しない。短所より長い長さ、全く増分傾向、容易なメンテナンス、トークンを生成するために使用されるトークンが存在しません。
2は、MySQLが増分はidは、OracleはシーケンスIDを生成することができます生成されますが、データベースクラスタ環境で、貧しい人々スケーラビリティに入っています。
図3は、グローバルに一意なIDを生成シングルスレッドのRedisの特性に基づいて、高性能のRedis。
IDは、現在の日付(YYMMDDHHMMSS)+6ビット(000000未満の中央値0より起動する)のために生成されます
20200206164329000001
図4は、雪に基づくアルゴリズムには、ネットワークのオーバーヘッド、高効率化が存在しない、局所的に生成されたグローバルIDを生成スノーフレーク
原則
Twitterの雪アルゴリズム雪片。
(「 - 」は、各部分と標識)IDスノーフレークアルゴリズムは、64ビットの整数、以下の構造を生成します。
0から0000000000 0000000000 0000000000 0000000000 0 - 0000000000から000000000000
Javaでの識別部、長い最上位ビットに0が正の数であり、符号ビットであるので、負の数は1であり、一般的に正のIDを生成し、それが0です。
スタンプ部41は、これをミリ秒レベルで、典型的には保存されていない現在のタイムスタンプに実装されるが、タイムスタンプの差(現在時刻 - 開始時刻定数)
69年を使用することができるタイムスタンプ41、(1L << 41)/(1000L * 60 * 60 * 24 * 365)= 69歳;これは、小さい値から出発生成されたIDを可能にします。
10ノード部は、Twitterは機械識別として5後に、ノード1024が配備されてもよい、データセンタ識別5として使用する前に実施しました。
12シリアル番号の一部、同一のノードが同じID 4096のMSを生成することができるサポート。
スノーフレークアルゴリズム、分散システムにおいて使用されるときに生成されたIDは、実質的に、時間的に増加して、データセンターの識別子と音符識別子は一意でなければならない機械
生成されたIDの各ノードが一意であることを、これは保証します。おそらく、我々は必然のような私たちのビジネスのニーズに、柔軟な配信ノード部分、によると、機械の識別など、データセンターの識別、5として、上記のように5を使用する必要はありません。必要に応じてデータセンターとして、すべての10を使用することができます計算機ID、これ以上のデータセンタ場合、3つだけは、データセンターとして使用することができ、計算機IDとして7。
スノーフレークIDは、全体の時間増分ソートに生成され、分散システム全体にわたって、高効率(データセンターとworkerIdによって区別されるように)衝突にIDを生成しません。
図5に示すように、高度に並行シナリオ内のノードのグローバルな順序を作成することによって生成された飼育係IDは、性能が良くありません。(まだ研究されていません)
Redisのを参照してください。
https://github.com/sentianhui/idglobal.git