8.7. Eclipse Vert.x Redis クライアントの変更点

Eclipse Vert.x 4 では、Redis クラスを使用して Redis クライアントと連携します。RedisClient クラスは利用できなくなりました。

注記
アプリケーションを RedisClient クラスから Redis クラスに移行するのに役立つため、ヘルパークラス RedisAPI が利用可能です。RedisAPI により、Redis Client クラスと同様の機能を複製できます。

新しいクラスには、プロトコルおよび Redis サーバー機能の機能強化がすべて含まれます。新しいクラスを使用して以下を行います。

  • すべての Redis コマンドとの連携
  • 単一サーバーへの接続
  • Redis Sentinel が有効になっている高可用性サーバーに接続
  • Redis のクラスター設定への接続
  • Redis 拡張機能での要求の実行
  • RESP2 および RESP3 サーバープロトコルサーバーの両方と通信

8.7.1. 既存の Redis クライアントアプリケーションから新規クライアントへの移行

既存のアプリケーションを新しい Redis クライアントに直接移行するか、またはヘルパークラス RedisAPI を使用して 2 つの手順でアプリケーションを移行できます。

アプリケーションを移行する前に、クライアントを作成する必要があります。

8.7.1.1. クライアントの作成

以下の例は、Eclipse Vert.x 3.x リリースで Redis クライアントが作成された方法を示しています。

// Create the redis client (3.x)
RedisClient client = RedisClient
  .create(vertx, new RedisOptions().setHost(host));

以下の例は、Eclipse Vert.x 4 で Redis クライアントを作成する方法を示しています。

// Create the redis client (4.x)
Redis client = Redis
  .createClient(
    vertx,
    "redis://server.address:port");

Eclipse Vert.x 4 では、クライアントは以下の標準接続文字列構文を使用します。

redis[s]://[[user]:password@]server[:port]/[database]

8.7.1.2. アプリケーションの RedisAPIへの移行

「RedisAPI」を使用して、接続の管理方法を決定できるようになりました。

  • クライアントがプールを使用する接続を管理できるようにします。

または

  • 新しい接続を要求すると、接続を制御できます。完了したら必ず接続を閉じるか、または返す必要があります。

クライアントを作成してから、要求を処理するためにアプリケーションを更新する必要があります。

以下の例は、Eclipse Vert.x 3.x リリースでクライアントを作成した後に要求を処理する方法を示しています。

// Using 3.x
// omitting the error handling for brevity
client.set("key", "value", s -> {
  if (s.succeeded()) {
    System.out.println("key stored");
    client.get("key", g -> {
      if (s.succeeded()) {
        System.out.println("Retrieved value: " + s.result());
      }
    });
  }
});

以下の例は、Eclipse Vert.x 4 でクライアントを作成した後に要求を処理する方法を示しています。この例では、ハードコーディングオプションの代わりに、キーと値のペアを設定するリストを使用します。コマンドで使用できる引数の詳細は、「 Redis SET コマンド 」を参照してください。

// Using 4.x
// omitting the error handling for brevity

// 1. Wrap the client into a RedisAPI
api = RedisAPI.api(client);

// 2. Use the typed API
api.set(
    Arrays.asList("key", "value"), s -> {
    if (s.succeeded()) {
      System.out.println("key stored");
      client.get("key", g -> {
        if (s.succeeded()) {
          System.out.println("Retrieved value: " + s.result());
        }
      });
    }
});

8.7.1.3. アプリケーションを Redis クライアントに直接移行

新しい Redis クライアントに直接移行する場合:

  • すべての新しい Redis コマンドを使用することができます。
  • 拡張機能を使用できます。
  • ヘルパークラスから新しいクライアントへの変換の一部を減らすことができますが、アプリケーションのパフォーマンスが向上することがあります。

クライアントを作成してから、要求を処理するためにアプリケーションを更新する必要があります。

以下の例は、Eclipse Vert.x 3.x リリースでクライアントを作成した後に要求を設定および取得する方法を示しています。

// Using 3.x
// omitting the error handling for brevity
client.set("key", "value", s -> {
  if (s.succeeded()) {
    System.out.println("key stored");
    client.get("key", g -> {
      if (s.succeeded()) {
        System.out.println("Retrieved value: " + s.result());
      }
    });
  }
});

以下の例は、Eclipse Vert.x 4 でクライアントを作成した後に要求を処理する方法を示しています。

// Using 4.x
// omitting the error handling for brevity

import static io.vertx.redis.client.Request.cmd;
import static io.vertx.redis.client.Command.*;

client.send(cmd(SET).arg("key").arg("value"), s -> {
    if (s.succeeded()) {
      System.out.println("key stored");
      client.send(cmd(GET).arg("key"), g -> {
        if (s.succeeded()) {
          System.out.println("Retrieved value: " + s.result());
        }
      });
    }
});

Eclipse Vert.x 4 では、すべての対話は send(Request) メソッドを使用します。

8.7.1.4. 応答の移行

Eclipse Vert.x 3.x では、クライアントは Redis 5 までの既知のコマンドをすべてハードコードするために使用され、応答もコマンドに従って入力されました。

新しいクライアントでは、コマンドはハードコーディングされません。応答のタイプは Response です。新しい Wire プロトコルにはさらに多くのタイプがあります。

古いクライアントでは、応答は以下のようになります。

  • null
  • Long
  • 文字列
  • JsonArray
  • JsonObject (INFO および HMGET アレイ応答の場合)

新しいクライアントでは、応答は以下のタイプになります。

  • null
  • Response

Response オブジェクトには型コンバーターがあります。たとえば、以下のようなコンバーターがあります。

  • toString()
  • toInteger()
  • toBoolean()
  • toBuffer()

受信したデータが要求されたタイプでない場合、型コンバーターはこれを可能な限り最も近いデータ型に変換します。特定の型への変換ができない場合は、UnsupportedOperationException が出力されます。たとえば、String から List または Map への変換はできません。

Response オブジェクトは Iterable インターフェースを実装するため、コレクションを処理することもできます。

以下の例は、MGET 要求の実行方法を示しています。

// Using 4.x
// omitting the error handling for brevity

import static io.vertx.redis.client.Request.cmd;
import static io.vertx.redis.client.Command.*;

client.send(cmd(MGET).arg("key1").arg("key2").arg("key3"), mget -> {
  mget.result()
    .forEach(value -> {
      // Use the single value