(本文只是我个人的理解,如有错误,请大佬们务必帮忙指正。)
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
。