8.7. Eclipse Vert.x Redis クライアントの変更点
Eclipse Vert.x 4 では、Redis
クラスを使用して Redis クライアントと連携します。RedisClient
クラスは利用できなくなりました。
- 注記
-
アプリケーションを
RedisClient
クラスからRedis
クラスに移行しやすくするため、ヘルパークラスRedisAPI
が利用できるようになりました。RedisAPI
により、RedisClient
クラスと同様の機能を複製できます。
新しいクラスには、プロトコルおよび 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
-
String
-
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