(本文只是我个人的理解,如有错误,请大佬们务必帮忙指正。)

hiredis库的一些特点:
1、获取到的各种结构体指针必须记得释放掉。

1.redisContext结构体

这个结构体和MySQL的C++库的MYSQL结构体的定位很类似,想要使用hiredis库就必须先创建该结构体,准确来说是用下面的函数获取这个结构体的指针。

2.redisConnect()函数

redisContext *redisConnect(const char *ip, int port)

传入ip地址和端口好就能连接到目标Redis服务器了。然后返回值就是指向1.中讲的结构体的指针。
注,每一个调用本函数获取到的redisContext指针都必须用hiredis的库函数来释放。

3.redisFree()函数

用于释放使用2.中函数得到的redisContext指针。

void redisFree(redisContext *c)

4.redisCommand()函数

作用:向Redis服务器发送命令,以 阻塞 的方式等待命令的执行结果,并返回。

void *redisCommand(redisContext *c, const char *format, ...)

第一个参数是redisContext指针。
第二个参数是要发送的命令,他是一个格式化字符串。
第三个参数就是格式化字符串中的可变参数。

实际上,该函数的内部分别调用了7. 8. 9.中讲解的三个函数。

使用案例:

redisReply *reply = (redisReply *)redisCommand(_publish_context, "PUBLISH %d %s", channel, message.c_str());

直接看该函数的定义的话,返回值是void*但实际上,该函数返回的是一个redisReply类型的结构体。
这个结构体是啥,看下面的讲解。

5.redisReply结构体

这个结构体记录的是对数据库操作以后,数据库反馈给我们的信息。
详情请查看文章开头粘贴的第一篇文章。

这里只再强调一点。每一个这种结构体(的指针)用完后后必须要记得释放掉使,用的就是freeReplyObject()函数。

6.freeReplyObject()函数

专门用于释放5.中的结构体指针。使用时直接传入redisReply结构体指针即可。

void freeReplyObject(void *reply);

7.redisAppendCommand()函数

作用:把函数中的redis命令缓存到本地。

int redisAppendCommand(redisContext *c, const char *format, ...)

8.redisBufferWrite()函数

作用:将缓存区中的命令发送给redis server。

int redisBufferWrite(redisContext *c, int *done)

本函数可以循环发送缓冲区中的命令,直到缓冲区数据发送完毕(done被置为1)。
使用示例:

// redisBufferWrite 可以循环发送缓冲区,直到缓冲区数据发送完毕(done被置为1)
int done = 0;
while (!done)
{
    if (REDIS_ERR == redisBufferWrite(this->_subscribe_context, &done))
    {
        std::cerr << "Subscribe command failed!" << std::endl;
        return false;
    }
}

9.redisGetReply()函数

作用:以 阻塞 的方式等待命令的执行结果,并存储到第二个参数中。

int redisGetReply(redisContext *c, void **reply)

成功返回REDIS_OK,否则返回REIDS_ERR