您的位置:首页 > 数据库 > Redis

redis库应用及接口函数

2016-07-12 09:51 615 查看
hiredis是redis数据库的C接口,目前只能在linux下使用,几个基本的函数就可以操作redis数据库了。

 

函数原型:redisContext *redisConnect(const char *ip, int port)

说明:该函数用来连接redis数据库,参数为数据库的ip地址和端口,一般redis数据库的端口为6379

该函数返回一个结构体redisContext。

 

函数原型:void *redisCommand(redisContext *c, const char *format, ...);

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

 

函数原型void freeReplyObject(void *reply);

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

 

函数原型:void redisFree(redisContext *c);

说明:释放redisConnect()所产生的连接。

 

下面用一个简单的例子说明:

 #include <stdio.h>

#include <stdlib.h>

#include <stddef.h>

#include <stdarg.h>

#include <string.h>

#include <assert.h>

#include "hiredis.h"

void doTest()

{

    //redis默认监听端口为6387 可以再配置文件中修改

    redisContext* c = redisConnect("127.0.0.1", 6379);

    if ( c->err)

    {

        printf("Connect to redisServer faile:%s\n",c->errstr);

        redisFree(c);

        return ;

    }

    printf("Connect to redisServer Success\n");

    const char* command1 = "set stest1 value1";

    redisReply* r = (redisReply*)redisCommand(c, command1);

    if( NULL == r)

    {

        printf("Execut command1 failure\n");

        redisFree(c);

        return;

    }

    if( !(r->type == REDIS_REPLY_STATUS && (strcmp(r->str,"OK")==0 || strcmp(r->str,"ok")==0 ) ))

    {

        printf("Failed to execute command[%s]\n",command1);

        freeReplyObject(r);

        redisFree(c);

        return;

    }    

    freeReplyObject(r);

    printf("Succeed to execute command[%s]\n", command1);

    const char* command2 = "strlen stest1";

    r = (redisReply*)redisCommand(c, command2);

    if ( r->type != REDIS_REPLY_INTEGER)

    {

        printf("Failed to execute command[%s]\n",command2);

        freeReplyObject(r);

        redisFree(c);

        return;

    }

    int length =  r->integer;

    freeReplyObject(r);

    printf("The length of 'stest1' is %d.\n", length);

    printf("Succeed to execute command[%s]\n", command2);

    const char* command3 = "get stest1";

    r = (redisReply*)redisCommand(c, command3);

    if ( r->type != REDIS_REPLY_STRING)

    {

        printf("Failed to execute command[%s]\n",command3);

        freeReplyObject(r);

        redisFree(c);

        return;

    }

    printf("The value of 'stest1' is %s\n", r->str);

    freeReplyObject(r);

    printf("Succeed to execute command[%s]\n", command3);

    const char* command4 = "get stest2";

    r = (redisReply*)redisCommand(c, command4);

    if ( r->type != REDIS_REPLY_NIL)

    {

        printf("Failed to execute command[%s]\n",command4);

        freeReplyObject(r);

        redisFree(c);

        return;

    }

    freeReplyObject(r);

    printf("Succeed to execute command[%s]\n", command4);    

    redisFree(c);

}

int main()

{

    WSADATA wsaData;

    int nRet;

    if((nRet = WSAStartup(MAKEWORD(2,2),&wsaData)) != 0){

        printf("WSAStartup failed\n");

        exit(0);

    }

    doTest();

    return 0;

}

执行结果为:

执行结果为:


 

分割线

------------------------------------------------------------------------

 

hiRedis操作同步API的接口函数只需下面三个即可:

redisContext*redisConnect(const char *ip, int port);
void*redisCommand(redisContext *c, const char *format, ...);
voidfreeReplyObject(void *reply);

1. 连接(Connecting)

redisconnect函数创建一个redisContext类型的数据结构,用于保存与服务器端的连接状态。redisContext 结构有一个整数类型的err域,当该值非零时表示连接有错,并表示错误类型。 更多错误信息请参考Errors部分。因此,当使用redisconnect函数连接Redis时,需要判断err域,检查建立连接是否成功。

redisContext *c = redisConnect("127.0.0.1", 6379);

if (c->err) {

    printf("Error: %s\n", c->errstr);

    // handle error

}


2. 发送命令(Send Commands)

         hiRedis有多种方式发送命令给Redis。其中,第一个方法是使用redisCommand。该函数的原型与printf很相似。最简单的形式,我们可以如下使用redisCommand:

reply = redisCommand(context, "SET foo bar");


         也可以使用像printf的格式化方法,插入字符串,如下:

reply = redisCommand(context, "SET foo %s", value);


      当需要在命令中传递一个二进制安全的字符串时,可以使用%b,一个字符串指针,和size_t类型的字符串长度。

reply = redisCommand(context, "SET foo %b", value, valuelen);


3. 使用replies

当命令成功执行时,redisCommand的返回值保存一个reply;而当有错误产生时,返回NULL,并且设置context中的err域。当有错误产生时,连接不可再用,需要重新创建一个连接。

redisCommand返回的标准的replies为redisReply类型。RedisReply类型的type域用于保存客户端接收到的是哪钟类型的reply:

REDIS_REPLY_STATUS:

命令返回一个status。status 字符串可以使用reply->str访问,字符串长度使用reply->len访问

REDIS_REPLY_ERROR:

命令返回一个error。error字符串访问同status。

 REDIS_REPLY_INTEGER:

 命令返回一个整数。整数值可以使用reply->integer域访问,类型为long long。

REDIS_REPLY_NIL

命令返回一个nil对象,表示访问数据不存在

REDIS_REPLY_STRING

命令返回一个字符串对象。访问同status。

REDIS_REPLY_ARRAY

命令返回一个数组对象。数组元素个数保存在reply->elements,数组中的每个元素都是一个redisReply对象,可以通过reply->element[…index…]访问。Redis支持嵌套数组。

最后,需要调用freeReplyObject()函数释放Replies。该函数会自动释放数组或嵌套数组的sub-replies 对象,因此不需要手动释放sub-replies。

4. 断开连接

         为了断开连接和释放context,需要调用如下函数:

void redisFree(redisContext *c);


该函数会立即关闭socket,然后释放context创建时的分配内容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  redis c语言 linux