Vert.x Redis

    Vert.x Redis Client 是 Vert.x 配套的 Redis 客户端实现。

    您可以通过 Vert.x Redis Client 来对 Redis 中的数据进行保存、获取、搜索和删除。Redis 是一个基于BSD协议开源的高性能Key-Value数据库。它可以存储字符串、哈希(hashes)、列表、无序集合(sets)和有序集合(sorted sets),所以通常被用做结构化数据存储服务器。要使用本组件,您必须有一个运行中的 Redis 实例。

    Redis 有着丰富的 API,总结如下:

    • Cluster - 与集群相关的命令。要使用这些命令,Redis 服务器的版本必须 >=3.0.0
    • Connection - 切换 DB、建立连接、断开连接、授权相关的命令
    • Hashes - 操作 hash 相关的命令
    • HyperLogLog - 使用 HyperLogLog 算法来快速计算元素基数的相关命令
    • Keys - 操作 Redis key 的相关命令
    • List - 操作 List 的相关命令
    • Pub/Sub - 发布/订阅模式的消息队列相关命令
    • Scripting - 解释运行 Lua 脚本的相关命令
    • Server - 管理 Redis 服务器的相关命令
    • Sets - 操作无序集合的相关命令
    • Sorted Sets - 操作有序集合的相关命令
    • Strings - 操作字符串的相关命令
    • Transactions - 处理事务的相关命令

    要使用 Vert.x Redis 客户端,需要添加下列依赖:

    • Maven (在 文件中):
    1. compile 'io.vertx:vertx-redis-client:3.4.1'

    连接 Redis 服务器

    要连接到 Redis 服务器,需要配置一些参数。配置参数包装在 对象中,有以下这些参数:

    • host: 默认是 localhost
    • port: 默认是 6379
    • encoding: 默认是 UTF-8
    • tcpKeepAlive: 默认是 true
    • tcpNoDelay: 默认是 true

    例如:

    1. RedisOptions config = new RedisOptions()
    2. .setHost("127.0.0.1");
    3. RedisClient redis = RedisClient.create(vertx, config);

    Vert.x Redis 客户端在连接 Redis 服务器失败时,会尝试重连。所以,如果您连接的 Redis 服务器需要授权,或者您连接的 Redis 服务器的 DB 不是默认 DB,您需要提供授权的密码,或者 DB 的 ID,配置参数如下:

    • auth
    • select

    当使用 Vert.x Redis 客户端连接到 Redis 服务器后,就可以使用 Vert.x Redis 客户端执行 Redis 命令。Vert.x Redis 客户端为执行 Redis 命令提供了一套十分简洁的 API,省去了手写命令的麻烦。例如,如果想通过 key 获得 value的话,可以这样:

    1. RedisClient redis = RedisClient.create(vertx, new RedisOptions());
    2. redis.get("mykey", res -> {
    3. if (res.succeeded()) {
    4. // so something...
    5. }

    要想了解更多 Redis 命令,请参考 Redis 官方文档

    发布/订阅模式

    Redis 支持发布/订阅模式的消息队列。需要注意,一旦一个 Redis 连接被注册为订阅者时,此连接将不能再执行其他命令,直到这个连接使用取消订阅者的命令。

    可以这样注册一个订阅者:

    发布消息:

    1. RedisClient redis = RedisClient.create(vertx, new RedisOptions());
    2. redis.publish("channel1", "Hello World!", res -> {
    3. if (res.succeeded()) {
    4. // so something...
    5. }
    6. });

    大部分 Redis 命令使用单个字符串或者字符串数组来作为参数,并且返回的也是单个字符串或者字符串数组。不过在处理 hash 值时,有其他一些更简洁的方式。

    hgetall 命令返回的结果将被转换成 JSON 对象。这样,您就可以使用 JSON 的语法来进行交互,这在与 Event Bus 通信时十分方便。

    1. keyName: "value",
    2. otherKeyName: "other value"
    3. }

    您可以向 msetnx 命令传入一个 JSON 对象以在 hash 中设置多个值(译者注:msetnx 命令,必须当且仅当所有给定 key 都不存在)。需要注意 key 和 value 都将被转换成字符串。

    1. {
    2. keyName: "value",
    3. otherKeyName: "other value"
    4. }

    您可以向 hmset 命令传入一个 JSON 对象以在 hash 中设置多个值(译者注:hmset 命令,如果给定 key 不存在,将创建新的 key)。需要注意 key 和 value 都将被转换成字符串。

    调用 zaddMany 方法可以同时向有序集合中添加多个member。需要注意 key 和 value 都将被转换成字符串。

    1. {
    2. otherScore: "other member"
    3. }

    服务器信息

    为让返回的服务器信息易于操作,Vert.x Redis 客户端将会把服务器信息转换成利于理解的 JSON 格式。格式为:JSON 对象的每个部分都包装着属于着这部分的属性。不在这个部分的属性,将会以其他的顶级对象部分展现:

    1. {
    2. server: {
    3. redis_version: "2.5.13",
    4. redis_git_sha1: "2812b945",
    5. redis_git_dirty: "0",
    6. os: "Linux 2.6.32.16-linode28 i686",
    7. arch_bits: "32",
    8. multiplexing_api: "epoll",
    9. gcc_version: "4.4.1",
    10. process_id: "8107",
    11. ...
    12. },
    13. memory: {...},
    14. client: {...},
    15. ...

    evalevalsha 命令十分特殊,因为它们可以返回任意类型。Vert.x 基于 Java 语言,而 Java 是强类型语言,并且我们又要避免使用 Object 类型,这使得返回任意类型变得比较困难。避免使用 Object 类型的原因是因为 Vert.x 也是多语言的,而不同语言之间的类型转换实现起来十分的复杂和困难。所以,我们会用 JsonArray 来包装 evalevalsha 命令的返回值,即便是像下面这样简单的脚本:

    1. return 10