客户端如何通过API操作Redis

版权声明:本文为博主原创文章,未经博主允许**可以**转载。 https://blog.csdn.net/u013736390/article/details/54603996

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

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

 

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

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

2,cd hiredis

3,使

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”

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

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

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

 

 

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

//背景是redisConnect这个函数的返回值

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

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

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

 

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

 

typedef struct redisReply {
  int类型; / * REDIS_REPLY_ * * /
  整数; / *类型为REDIS_REPLY_INTEGER时的整数* /
  size_t len; / *字符串长度* /
  char * str; / *用于REDIS_REPLY_ERROR和REDIS_REPLY_STRING * /
  size_t元素; / *元素数量,REDIS_REPLY_ARRAY * /
  struct redisReply ** element; / * REDIS_REPLY_ARRAY的元素向量* /
  } redisReply;

键入值如下:

REDIS_REPLY_STATUS表示状态,通过上面的str查看其值,len查看其长度
REDIS_REPLY_ERROR表示出错,  通过上面的str查看其值,len查看其长度
REDIS_REPLY_INTEGER表示返回整数,通过上面的整数查看其值
REDIS_REPLY_NIL表示没有数据返回
REDIS_REPLY_STRING表示返回字符串,通过上面的str查看其值,len查看其长度
REDIS_REPLY_ARRAY表示返回一个数组,通过上面的元素查看数组个数,通过元素[index]的方式访问数组元素,每个数组元素是一个redisReply对象的指针。

 

 

 

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

//答复是redisCommand的返回值

void freeReplyObject(void * reply);
 

 

 

//释放背景下,关闭连接

//背景是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的错误就为真
    {

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



    memset(command,0,sizeof(command));

    回复= redisCommand(上下文中,命令); //这个命令如果执行成功的话,返回的是一个字符串
    if(!(reply-> type == REDIS_REPLY_STRING))
    {
        perror(“hget 111 age error”);
        返回-3;
    }
    printf(“str =%s,len =%d \ n”,reply-> str,reply-> len); //打印结果为str = 24,len = 2
    freeReplyObject(回复); //释放回复



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



    memset(command,0,sizeof(command));
    sprintf(命令,“%s”,“获取地址”);
    回复= redisCommand(上下文中,命令); //因为没有地址这个键,所以这个命令执行成功的话返回的是nil(空)
    if(!(reply-> type == REDIS_REPLY_NIL))
    {
        perror(“get address”);
        返回-5;
    }
    printf(“成功地址是nil \ n”);
    freeReplyObject(回复); //释放回复



    memset(command,0,sizeof(command));
    sprintf(命令,“%s”,“hgetall 111”);
    回复= redisCommand(上下文中,命令);//如果这个命令执行成功(不管里面有没有元素)的话,返回的是一个数组,数组里面保存的是这个哈希里面所有的现场跟值
    if(!(reply-> type == REDIS_REPLY_ARRAY))
    {
        perror(“hvals 111错误”);
        返回-6;
    }
    int num = reply-> elements; //返回的是数群元素的个数,在本例中数为6
    for(int i = 0; i <num; i ++)
    {
        printf(“str =%s,len =%d \ n”,reply- >元素[I] - > STR,reply->元素[I] - > LEN); // reply->元素[I]是一个指向redisReply的指针

    }

 

      //结果为

      str = name len = 4

      str = hongdingyi len = 10

      str =年龄len = 3

      str = 24 len = 2

      str =数字len = 6

      str = 1829615 len = 7


    freeReplyObject(回复);
    redisFree(上下文);
    返回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 /

没有更多推荐了,返回首页