客户端如何通过API操作Redis

来源:互联网 发布:openresty java开发 编辑:程序博客网 时间:2024/05/01 23:40

前两篇文章我主要对Redis进行了一个大体的介绍以及对它种常用数据类型的基本操作,那么今天我将说下,我们客户端如何通过API操作Redis(非常简单的哦)

开篇之前,我继续说下昨天晚上还没有结束的故事,昨天晚上我不是说我复制、COPY,重新发布了文章嘛偷笑,但是之前我跟CSDN管理员发了QQ信息跟邮件,请他们帮忙恢复被我不小心删掉的文章,今天他们给我回信息了,说帮我恢复得意,我确实很开心(虽然自己已经发布了),但还是要感谢人家的,哈哈。CSDN客服还不错哦偷笑


好了,不扯了,下面直接步入今天的正题!


通过API操作Redis,那么API在哪呢,API就在hiredis这个开源库里面


安装步骤(在终端依次输入如下命令):

1、git clone https://github.com/redis/hiredis.git

2、cd hiredis

3、make

4、sudo make install

到这步,hiredis就安装好了,默认动态库(libhiredis.so)保存在/usr/local/lib中,默认头文件(hiredis.h)保存在/usr/local/include/hiredis中。



下面说说几个常用API


//该函数是用来连接Redis的

//ip是Redis的ip地址,如果是本机的话我们就写"127.0.0.1"

//port是Redis的端口,默认为6379

//如果连接失败,结构体对象里面的err为真

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



//该函数是用来执行Redis操作命令的

//context是redisConnect这个函数的返回值

//format是一些操作Redis命令,比如set age 10(所以上一篇讲的常用数据类型的操作命令非常的重要)

//函数返回值是void*,但是我们要将其强转为redisReply*,来进行下一步操作

void *redisCommand(redisContext *context,const char *format, ...);


配注:redisReply是一个结构体,里面的type值保存的是redisCommand函数返回的状态(通过状态可以判断命令是否执行成功)

typedef struct redisReply { int type; /* REDIS_REPLY_* */ long long integer; /* The integer when type is REDIS_REPLY_INTEGER*/ size_t len; /* Length of string */ char *str; /* Used for both REDIS_REPLY_ERROR and REDIS_REPLY_STRING*/ size_t elements; /* number of elements, for REDIS_REPLY_ARRAY */ struct redisReply **element;/* elements vector for REDIS_REPLY_ARRAY*/ } 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对象的指针。




//释放reply所占用的内存(避免内存泄漏)

//reply是redisCommand的返回值

void freeReplyObject(void *reply);



//释放context,关闭连接

//context是redisConnect的返回值

void redisFree(redisContext *context);



最后通过一个测试案例来对上面的API进行一个详细说明!

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include<hiredis/hiredis.h>//头文件
int Mytest()
{
    char command[1024]={0};
    redisReply * reply=NULL;
    redisContext *context=redisConnect("127.0.0.1",6379);//建立连接
    if(context->err)//错误的话context的err就为真
    {

        redisFree(context);//释放context
        perror("connect redis-server  error");
        return -1;
    }
    sprintf(command,"%s","hmset 111 name hongdingyi age 24");
    reply=redisCommand(context,command);//这个命令如果执行成功的话,返回的是一个状态,也就是type==REDIS_REPLY_STATUS,并且其值是OK
    if(!(reply->type==REDIS_REPLY_STATUS&&strcmp(reply->str,"OK")==0))
    {
        perror("hmset 111 name hongdingyi age 24 error");
        return -2;
    }
    printf("str=%s,len=%d\n",reply->str,reply->len);//打印结果为str=OK,len=2
    freeReplyObject(reply);//释放reply



    memset(command,0,sizeof(command));
    sprintf(command,"%s","hget 111 age");
    reply=redisCommand(context,command);//这个命令如果执行成功的话,返回的是一个字符串
    if(!(reply->type==REDIS_REPLY_STRING))
    {
        perror("hget 111 age error");
        return -3;
    }
    printf("str=%s,len=%d\n",reply->str,reply->len);//打印结果为str=24,len=2
    freeReplyObject(reply);//释放reply



    memset(command,0,sizeof(command));
    sprintf(command,"%s","hset  111  number 1829615");
    reply=redisCommand(context,command);//这个命令如果执行成功的话返回1(number这个field还不存在),或者0(number这个field已经存在),这两个都是整数
    if(!(reply->type==REDIS_REPLY_INTEGER))
    {
        perror("hset 111  number 1829615 error");
        return -4;
    }
    printf("integer=%lld\n",reply->integer);//因为第一次number还不存在,所以integer=1
    freeReplyObject(reply);//释放reply



    memset(command,0,sizeof(command));
    sprintf(command,"%s","get  address");
    reply=redisCommand(context,command);//因为没有address这个key,所以这个命令执行成功的话返回的是nil(空)
    if(!(reply->type==REDIS_REPLY_NIL))
    {
        perror("get address");
        return -5;
    }
    printf("success address is nil\n");
    freeReplyObject(reply);//释放reply



    memset(command,0,sizeof(command));
    sprintf(command,"%s","hgetall  111");
    reply=redisCommand(context,command);//如果这个命令执行成功(不管里面有没有元素)的话,返回的是一个数组,数组里面保存的是这个哈希里面所有的field跟value
    if(!(reply->type==REDIS_REPLY_ARRAY))
    {
        perror("hvals 111 error");
        return -6;
    }
    int num=reply->elements;//返回的是数组元素的个数,在本例中num为6
    for(int i=0;i<num;i++)
    {
        printf("str=%s,len=%d\n",reply->element[i]->str,reply->element[i]->len);//reply->element[i]是一个指向redisReply的指针

    }

      //结果为

      str=name          len=4

      str=hongdingyi   len=10

      str=age             len=3

      str=24               len=2

      str=number       len=6

      str=1829615      len=7


    freeReplyObject(reply);
    redisFree(context);
    return 0;
}
int main(int argc,char **argc)
{
    Mytest();
}




是不是好简单啊(最重要的还是要记住那些命令),这样我们在终端上输入gcc main.c  -lhiredis  -o hiredis 就可以生成可执行程序hiredis了,但是在执行./hiredis之前,千万别忘了加载动态库


加载动态库主要有两个方法:


1、在终端上输入 export  LD_LIBRARY_PATH=/usr/local/lib 但是这种方法只对当前这个终端有效,终端关闭则无效


2、为用户设置加载动态库路径

步骤如下:

1、vim  ~/.bashrc(ubuntu)     vim  ~/.profile(Red Hat)

2、在最后一行加上:export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/





笔者留言:

Redis到这里就告一段落咯,2017:1:19:12:53我该睡了(****BYE****)吐舌头




0 0
原创粉丝点击