hiredis 是一个C语言编写的轻量级Redis客户端,用于与Redis服务器进行通信。在使用hiredis执行命令时,返回值代表了命令的执行结果。本文将介绍hiredis执行返回值的含义,并提供相应的代码示例。

1. hiredis 简介

hiredis 是一个使用C语言编写的Redis客户端库,具有简洁、高效的特点。它提供了一套简单的API接口,方便开发者与Redis服务器进行通信。hiredis支持多种操作,包括执行命令、获取返回值、处理错误等。

2. hiredis 执行返回值的含义

在hiredis中,执行命令后会返回一个redisReply结构体指针,该结构体中包含了命令执行的返回结果。redisReply结构体的定义如下:

typedef struct redisReply {
    int type;             // 返回结果的类型
    long long integer;    // 数字类型的返回结果
    size_t len;           // 字符串类型的返回结果长度
    char *str;            // 字符串类型的返回结果
    size_t elements;      // 数组类型的返回结果长度
    struct redisReply **element;  // 数组类型的返回结果
} redisReply;

根据返回结果的类型不同,redisReply结构体中的成员也不同。下面是redisReply结构体中type成员的取值和对应的含义:

  • REDIS_REPLY_STRING:字符串类型的返回结果,可以通过str成员获取。
  • REDIS_REPLY_ARRAY:数组类型的返回结果,可以通过element成员获取。
  • REDIS_REPLY_INTEGER:整数类型的返回结果,可以通过integer成员获取。
  • REDIS_REPLY_NIL:空值类型的返回结果。
  • REDIS_REPLY_STATUS:状态类型的返回结果,可以通过str成员获取。
  • REDIS_REPLY_ERROR:错误类型的返回结果,可以通过str成员获取。

3. hiredis 执行返回值示例

下面是一个使用hiredis执行命令并获取返回值的示例代码:

#include <stdio.h>
#include <hiredis.h>

int main() {
    redisContext *c = redisConnect("127.0.0.1", 6379);
    if (c == NULL || c->err) {
        if (c) {
            printf("Connection error: %s\n", c->errstr);
            redisFree(c);
        } else {
            printf("Connection error: can't allocate redis context\n");
        }
        return -1;
    }

    redisReply *reply = (redisReply *)redisCommand(c, "SET foo bar");
    printf("SET: %s\n", reply->str);
    freeReplyObject(reply);

    reply = (redisReply *)redisCommand(c, "GET foo");
    printf("GET: %s\n", reply->str);
    freeReplyObject(reply);

    redisFree(c);
    return 0;
}

以上代码连接到本地的Redis服务器,执行了两个命令:先是SET命令设置了一个key-value对,然后是GET命令获取该key对应的value。在执行每个命令后,通过reply指针获取命令的返回结果,并输出到控制台上。

4. hiredis 执行返回值处理示例

根据返回结果的类型,我们可以使用不同的方式来处理返回值。下面是一个示例代码,演示了如何根据返回结果的类型来处理返回值:

#include <stdio.h>
#include <hiredis.h>

void handleStringReply(redisReply *reply) {
    printf("String Reply: %s\n", reply->str);
}

void handleArrayReply(redisReply *reply) {
    printf("Array Reply:\n");
    for (size_t i = 0; i < reply->elements; i++) {
        printf("%s\n", reply->element[i]->str);
    }
}

void handleIntegerReply(redisReply *reply) {
    printf("Integer Reply: %lld\n", reply->integer);
}

void handleNilReply(redisReply *reply) {
    printf("Nil Reply\n");
}

void handleStatusReply(redisReply *reply) {
    printf("Status Reply: %s\n", reply->str);
}

void handleErrorReply(redisReply *reply) {
    printf("Error Reply: %s\n", reply->str);
}

int main() {
    redisContext *c = redisConnect("127.0.0.1", 6379);
    if (c == NULL || c->err) {
        if (c) {
            printf("Connection error: %s\n", c->errstr);
            redisFree(c);
        } else