私たちの仕事では、データベーステーブル内のいくつかのフィールドは、注文数を増やすだけでトレンドに使用されます、我々は2つのメソッドを紹介します、1は、乱数発生器を使用しての伝統的な方法で、他は比較的現在の使用であります人気の「分散生成アルゴリズムのユニークなID - 雪のアルゴリズムは、」達成するために。
まず、乱数生成タイムスタンプのユニークなID
我々はRandomUtil.generateOrderCode()で1000ユニークなIDを生成し、ループのために書き、その結果は、我々が重複したIDが表示されますでしょう。
/ ** *乱数生成のutil * / publicクラスRandomUtil { プライベート静的新しい新しい=決勝のSimpleDateFormat dateFormatOneてSimpleDateFormat( "yyyyMMddHHmmssSS"); 民間最終ThreadLocalRandom静的ランダムThreadLocalRandom.current =(); //生成された注文番号-道 公衆ストリングgenerateOrderCode静的(){ // TODO:タイムスタンプ+ Nランダムシーケンス番号 (4)リターンdateFormatOne.format generateNumber +(。DateTime.Now()toDateまで()); } //ランダムシーケンス番号Nの 公衆ストリングgenerateNumber静的(最終NUMはint){ StringBufferのStringBufferの新しい新しいSB =(); のための(INT I = 1; I <= NUM; I ++){ sb.append(にRandom.nextInt(9)。); } sb.toStringを返します() ; } }
そこで、「乱数生成に基づいて」非常に同時シナリオでのアプローチは、当社の要件を満たしていない、我々は「分散生成アルゴリズム固有のIDという別のより人気のある、一般的な方法をご紹介します - 達成するために雪のアルゴリズム「。
導入「スノーフレーク法」、あなたはGitHubの上で、このリンクを参照することができジュニアパートナーのために、私はそれが非常に明確に話すと思う:https://github.com/souyunku/SnowFlake、ここでは詳細なデバッグに入ることはありません次のセクションでは、の傍受をまとめたものです。
第二に、分散型のユニークなID生成アルゴリズム - アルゴリズムの雪
我々は、それが重複して検出されません)(SNOW_FLAKE.nextIdと1000年のユニークなIDを生成し、ループのために書きます。
/ ** *アルゴリズム雪
* / publicクラススノーフレークは{ タイムスタンプ開始// プライベートロングSTART_STAMP =最終静的1480166465631Lを; //各部分によって占められるビットの数は 民間最終静的長いSEQUENCE_BIT = 12; //ビットのシリアル番号が占めます多くの 民間最終静的長いMACHINE_BIT = 5; // によって占められるビットの機械識別番号 民間最終静的長いDATA_CENTER_BIT = 5; //データセンタによって占められるビットの数 //の各部分の最大値 民間最終静的長いMAX_DATA_CENTER_NUM = -1L ^ ( << DATA_CENTER_BIT -1L); プライベート静的ロングMAX_MACHINE_NUM最終-1L = ^(-1L << MACHINE_BIT); プライベート静的ロングMAX_SEQUENCE最終-1L = ^(-1L << SEQUENCE_BIT); //左方変位の各部分のための 民間最終的な静的長いMACHINE_LEFT = SEQUENCE_BIT。 民間最終静的長いDATA_CENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT。 民間最終静的長いTIMESTAMP_LEFT = DATA_CENTER_LEFT + DATA_CENTER_BIT。 プライベート長いdataCenterId。//数据中心 プライベート長いmachineId。//机器标识 プライベート長いシーケンス= 0L; //序列号 民間長いlastStamp = -1L; //上一次时间戳 公共スノーフレーク(長いdataCenterId、長いmachineId){ 場合(dataCenterId> MAX_DATA_CENTER_NUM || dataCenterId <0){ "(新しいIllegalArgumentExceptionをスローしdataCenterIdは大きくすることはできませんMAX_DATA_CENTER_NUM未満0" )より。 } IF(machineId> MAX_MACHINE_NUM || machineId <0){ 新をスロー(「machineIdはMAX_MACHINE_NUM以上0未満にすることはできません」)。 } this.dataCenterId = dataCenterId。 this.machineId = MachineID; } //次のID生成 公共NEXTID同期ロング(){ ロングcurrStamp getNewStamp =を(); IF(currStamp <lastStamp){ のRuntimeException新しい新規( "クロックがIDを生成することを拒否後退")スロー; } (currStamp == lastStamp IF){ //同じミリ秒以内に、シーケンス番号をインクリメント 。配列=(+配列1)&MAX_SEQUENCE; / /ミリ秒の同じ数のシーケンスが最大に達している IF(配列== 0L){ currStamp getNextMill =(); } }エルス{ //異なるMSは、シーケンス番号が0に設定されている 配列= 0L; } lastStamp = currStamp。 リターン(currStamp - START_STAMP)// << TIMESTAMP_LEFTスタンプコンポーネント | dataCenterId << DATA_CENTER_LEFT //データセンタ部分 | machineId << MACHINE_LEFT //機械識別部 |配列; // SEQ ID NOの一部 } プライベートロングgetNextMill(){ ロングミルgetNewStamp =(); 一方、(ミル<= lastStamp){ ミルgetNewStamp =(); } ミルを返す; } プライベートロングgetNewStamp(){ System.currentTimeMillisリターン(); } }
要約すると、我々は重複したIDの生成を回避するために、ユニークなIDを生成するために、同時高の多数を持っている、あなたは、第二の雪アルゴリズムを生成する必要があります。