hiredis使用简介

hiredis是Redis数据库的C接口,目前只能在Linux下使用,几个基本的函数就可以操作redis数据库了。

一、API简介
1、redisContext* redisConnect(const char *ip, int port);

    说明:该函数用来连接redis数据库,参数为数据库的ip地址和端口,一般redis数据库的端口为6379。
    类似的提供了一个函数redisContext* redisConnectWithTimeout(const char *ip, int port, timeval tv)

        redisConnect函数用来创建一个叫redisContext的东西,它包含了连接相关的信息。它里面有个err字段,0表示正常,其他表示出错了!通过errstr字段可以知晓错误信息。

// 建立连接
redisContext *c = redisConnect("127.0.0.1", 6379);
if (c != NULL && c->err) {
        printf("Error: %s\n", c->errstr);    // handle error
}

2、void *redisCommand(redisContext *c, const char *format, …);

    说明:该函数执行redis数据库中的操作命令,第一个参数为连接数据库时返回的redisContext,剩下的参数为变参,就如C标准函数printf函数一样的变参。
    返回值为void*,一般强制转换成为redisReply类型,以便做进行进一步的处理。

        redisCommand的调用格式类似printf函数,上面的第二条调用语句的作用在于输入二进制格式的value内容,其后必须表明二进制的字节长度!

// 执行命令
reply = redisCommand(context, "SET key value");
reply = redisCommand(context, "SET key %s", value);
reply = redisCommand(context, "SET key %b", value, (size_t) valuelen);
reply = redisCommand(context, "SET key:%s %s", myid, value);

redisCommand函数返回一个东西叫redisReply,我们需要通过判断它的type字段来知道返回了具体什么样的内容:
REDIS_REPLY_STATUS 表示状态,内容通过str字段查看,字符串长度是len字段
REDIS_REPLY_ERROR 表示出错,查看出错信息,如上的str,len字段
REDIS_REPLY_INTEGER 返回整数,从integer字段获取值
REDIS_REPLY_NIL 没有数据返回
REDIS_REPLY_STRING 返回字符串,查看str,len字段
REDIS_REPLY_ARRAY 返回一个数组,查看elements的值(数组个数),通过element[index]的方式访问数组元素,每个数组元素是一个redisReply对象的指针

3、void *redisCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);

    说明:一个类似redisCommand的函数,批量执行命令

4、void freeReplyObject(void *reply);

    说明:释放redisCommand执行后返回的redisReply所占用的内存

5、void redisFree(redisContext *c);

    说明:断开redisConnect()所产生的连接,并释放redisContext的内容

二、使用步骤
1、redisCommand的函数执行流程说明:
a. 格式化redis command
b. 格式化后的命令内容放入redisContext的输出缓冲区
c. 调用redisGetReply函数执行命令,得到结果

2、管道的使用方式:
a.填入需要执行的命令
void redisAppendCommand(redisContext *c, const char *format, …);
void redisAppendCommandArgv(redisContext *c, int argc,const char **argv, const size_t *argvlen);
b. 获取命令的输出结果
int redisGetReply(redisContext *c, void **reply);
c. 释放输出结果
void freeReplyObject(void *reply);

// 例子
redisReply *reply = NULL;
redisAppendCommand(context,"set key1 value");
redisAppendCommand(context,"get key2");
redisGetReply(context,&reply); // reply for set
freeReplyObject(reply);
redisGetReply(context,&reply); // reply for get
freeReplyObject(reply);

// 订阅模式
reply = redisCommand(context,"SUBSCRIBE test");
freeReplyObject(reply);
while(redisGetReply(context,&reply) == REDIS_OK) {
        // consume message
        freeReplyObject(reply);
}

3、redisReply返回结果处理:
REDIS_OK 正常
REDIS_ERR_IO   IO读/写出现异常,通过errno查看原因
REDIS_ERR_EOF 服务器关闭了链接,读结束
REDIS_ERR_PROTOCOL 分析redis协议内容出错
EDIS_ERR_OTHER 其他未知的错误
上述错误类型都可以通过redisReply的errstr字段查看简短的描述

三、异步API
(异步API的使用方式和同步API差不多,在这儿列出不同的函数吧)
1、连接redis服务器
redisAsyncContext *c = redisAsyncConnect(“127.0.0.1”, 6379);
if (c->err) {
printf(“Error: %s\n”, c->errstr);
// handle error
}

2、设置连接、断开的钩子函数
int redisAsyncSetConnectCallback(redisAsyncContext *ac, redisConnectCallback *fn);
int redisAsyncSetDisconnectCallback(redisAsyncContext *ac, redisDisconnectCallback *fn);

3、插入命令信息
int redisAsyncCommand(
redisAsyncContext *ac, redisCallbackFn *fn, void *privdata,
const char *format, …);
int redisAsyncCommandArgv(
redisAsyncContext *ac, redisCallbackFn *fn, void *privdata,
int argc, const char **argv, const size_t *argvlen);
获取命令输出和同步API相同

4、关闭连接
void redisAsyncDisconnect(redisAsyncContext *ac);

四、辅助API
下面的API主要用于其他编程语言绑定的术后,可以读取分析数据
redisReader *redisReaderCreate(void);
void redisReaderFree(redisReader *reader);
int redisReaderFeed(redisReader *reader, const char *buf, size_t len);
int redisReaderGetReply(redisReader *reader, void **reply);

    // 例子
    #include <stdio.h>  
    #include <stdlib.h>  
    #include <stddef.h>  
    #include <stdarg.h>  
    #include <string.h>  
    #include <assert.h>  
    #include <hiredis/hiredis.h>  

    void doTest()  
    {  
        // redis默认监听端口为6387 可以再配置文件中修改  
        redisContext* redis = redisConnect("127.0.0.1", 6379);  
        if ( NULL == redis || redis->err)  
        {
            // redis为NULL与redis->err是两种不同的错误,若redis->err为true,可使用redis->errstr查看错误信息  
            redisFree(c);  
            printf("Connect to redisServer faile\n");  
            return ;  
        }  
        printf("Connect to redisServer Success\n");  
        const char* command1 = "set stest1 value1";  
        redisReply* reply = (redisReply*)redisCommand(c, command1);    // 执行命令,结果强转成redisReply*类型  
        if( NULL == reply)  
        {  
            printf("Execut command1 failure\n");  
            redisFree(redis);     // 命令执行失败,释放内存  
            return;  
        }  
        if( !(reply->type == REDIS_REPLY_STATUS && strcasecmp(reply->str,"OK")==0))  
        {       
            // 判断命令执行的返回值  
            printf("Failed to execute command[%s]\n",command1);  
            freeReplyObject(reply);  
            redisFree(redis);  
            return;  
        }     
        freeReplyObject(reply);  
        printf("Succeed to execute command[%s]\n", command1);  
        // 一切正常,则对返回值进行处理  
    }  

    int main()  
    {  
        doTest();  
        return 0;  
    }  
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值