2-2-3分散IDの問題と解決策

1.分散ID

1.1分散IDの概要

分散IDが必要な理由(分散クラスター環境でのグローバル一意ID)
ここに画像の説明を挿入

第二に、分散IDのソリューション

2.1。ソリューション1、UUID

UUIDは、ユニバーサル一意識別子として変換されるユニバーサル一意識別子を指します。重複するUUIDとエラーの状況は非常に低いため、この問題を考慮する必要はありません。JavaでUUIDを取得するには、java.utilパッケージで提供されているメソッドを使用できます。

public class MyTest {
    
    
 public static void main(String[] args) {
    
    
 System.out.println(java.util.UUID.randomUUID().toString());
 }
}

ここに画像の説明を挿入

2.2オプション2、一意のデータベースの自己インクリメントID

AテーブルのサブテーブルがA1とA2の場合、A1とA2のIDを増やすことはできません。IDを取得するにはどうすればよいですか。Mysqlデータベースを個別に作成し、このデータベースにテーブルを作成できます。このテーブルのIDはインクリメントに設定されます。他の場所でグローバルに一意のIDが必要な場合は、このMysqlデータベースにこのテーブルをシミュレートできます。レコードIDを挿入します。この時点でインクリメントされ、Mysqlのselect last_insert_id()を使用して、このテーブルに新しく作成されたIDを取得できます。

たとえば、データベースインスタンスglobal_id_generatorを作成し、その中にデータテーブルを作成しました。テーブル構造は次のとおりです。


-- Table structure for DISTRIBUTE_ID

DROP TABLE IF EXISTS `DISTRIBUTE_ID`;

CREATE TABLE `DISTRIBUTE_ID` (
 `id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '主键',
 `createtime` datetime DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

分散クラスター環境のアプリケーションがグローバルに一意の分散IDを取得する必要がある場合は、コードを使用してこの
データベースインスタンスに接続し、次のsqlステートメントを実行できます。

insert into DISTRIBUTE_ID(createtime) values(NOW());
select LAST_INSERT_ID();

注:
1)ここでのcreatetimeフィールドには実用的な意味はありません。これは、IDを自動的に増やすことができるように、データをランダムに挿入するためのものです。2)⾏がすぐにidに配布される⽣注意のMysqlの例のみを使用しますが、パフォーマンスと信頼性は必要であるため十分ではありません-idに到達
するためにデータベースに接続するための生成コード、パフォーマンス⽆法の保護、さらに、mysqlデータベースインスタンスがハングアップすると、
分散IDを取得できません
3)上記の状況に対応して、分散IDをクラスターアーキテクチャーに生成するために使用するmysqlデータベースを設計した開発者もいますが、
実際、この方法は煩雑すぎるため、現在は基本的に使用されていません。

2.3。ソリューション3、SnowFlakeアルゴリズム

2.3.1SnowFlakeの概要

スノーフレークアルゴリズムは、分散IDを生成するためにTwitterによって開始された戦略です。
スノーフレークアルゴリズムはアルゴリズムです。このアルゴリズムに基づいてIDを生成できます。生成されたIDはlong型です。Javaでは、long
型は8バイト(64ビット)です。以下は、スノーフレークアルゴリズムの使用法です。生成されたIDのバイナリ形式を示します。
ここに画像の説明を挿入

2.3.1SnowFlakeソースコード

さらに、すべてのインターネット企業は、上記のスキームに基づいて、Didiのtinyid(データベース実装に基づく)、Baiduのuidgenerator(SnowFlakeに基づく)、Meituanのリーフ(データベースに基づく)、SnowFlakeなどの分散IDジェネレーターもカプセル化しています。 、 彼らです。

2.5。RedisIncrコマンドを使用してグローバル一意IDを取得します

Redis Incrコマンドは、キーに保存されている数値をインクリメントします。キーが存在しない場合、キーの値は最初に0に初期化され、次にINCR操作が実行されます。
<key、value>
<id、>
.incr(id)1 2 3 4

ここに画像の説明を挿入

  • Redisのインストール(Redisを使用するために単一のノードをインストールすることを示します。Redis自体の特定のコンテンツについては、後続の分散キャッシュコースで詳しく説明します)

    redis-3.2.10.tar.gzを正式にダウンロード
    し、Linuxサーバーにアップロードします。tar-zxvfredis -3.2.10.tar.gz
    cdを解凍してファイルディレクトリを解凍し、解凍したredisをコンパイルして、
    作成
    してからcdします。 src file記録し、make installを実行
    して、解凍ディレクトリ内の構成ファイルredis.conf変更し、保護モードをオフにします。

ここに画像の説明を挿入
srcディレクトリで./redis-server…/redis.confを実行してredisサービスを開始します

  • Javaコードでは、Jedisクライアントを使用してReidsのincrコマンドを呼び出し
    、jedisクライアントjarへのグローバルID参照を取得します。
<dependency>
 <groupId>redis.clients</groupId>
 <artifactId>jedis</artifactId>
 <version>2.9.0</version>
</dependency>

Javaコード(ここでは単一ノードに接続し、接続プールは使用しません)

Jedis jedis = new Jedis("127.0.0.1",6379);
try {
    
    
 long id = jedis.incr("id");
 System.out.println("从redis中获取的分布式id为:" + id);
} finally {
    
    
 if (null != jedis) {
    
    
 jedis.close();
 } }

おすすめ

転載: blog.csdn.net/qq_42082278/article/details/112648251