8.7. Eclipse Vert.x Redis 客户端的更改
在 Eclipse Vert.x 4 中,使用 Redis
类用于 Redis 客户端。class RedisClient
不再可用。
- 注意
-
为了帮助您将应用程序从
RedisClient
迁移到Redis
类,可以使用一个帮助程序类RedisAPI
。RedisAPI
可让您复制与RedisClient
类类似的功能。
新类包含协议和 Redis 服务器功能中的所有增强功能。使用新类来:
- 使用所有 Redis 命令
- 连接到单一服务器
- 连接到启用了 Redis Sentinel 的高可用性服务器
- 连接到 Redis 的集群配置
- 在 Redis 扩展中执行请求
- 与 RESP2 和 RESP3 服务器协议服务器通信
8.7.1. 将现有 Redis 客户端应用程序迁移到新客户端
您可以将现有应用程序直接迁移到新的 Redis
客户端,或者在两个步骤中使用帮助程序类 RedisAPI
来迁移应用程序。
在迁移应用程序前,您必须创建客户端。
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 中,用来硬编码所有已知的命令 till Redis 5 的客户端也根据 命令键入响应。
在新客户端中,命令不会硬编码。响应是 Response
类型。新的线路协议具有更多类型范围。
在较旧的客户端中,响应是以下类型:
-
null
-
Long
-
字符串
-
JsonArray
-
JsonObject
(适用于INFO
和HMGET
数组响应)
在新客户端中,响应是以下类型:
-
null
-
响应
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
8.7.2. Eclipse Vert.x Redis 客户端中的更新
本节论述了 Redis 客户端中的更改。
8.7.2.1. 从 Redis 角色和节点选项中删除已弃用的术语 "slave"
在 Redis 角色和节点选项中,已弃用的术语"slave"已被"replica"替代。
- 角色
-
以下示例显示了在 Eclipse Vert.x 3.x 版本中使用
SLAVE
角色。
// Before (3.x) Redis.createClient( rule.vertx(), new RedisOptions() .setType(RedisClientType.SENTINEL) .addConnectionString("redis://localhost:5000") .setMasterName("sentinel7000") .setRole(RedisRole.SLAVE));
以下示例显示了在 Eclipse Vert.x 4 中使用 REPLICA
角色。
// After (4.x) Redis.createClient( rule.vertx(), new RedisOptions() .setType(RedisClientType.SENTINEL) .addConnectionString("redis://localhost:5000") .setMasterName("sentinel7000") .setRole(RedisRole.REPLICA));
- 节点选项
-
以下示例显示了在 Eclipse Vert.x 3.x 版本中使用节点类型
RedisSlaves
。
// Before (3.9) options.setUseSlaves(RedisSlaves);
以下示例显示了在 Eclipse Vert.x 4 中使用节点类型 RedisReplicas
。
// After (4.x) options.setUseReplicas(RedisReplicas);