客户端如何通过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****)
- 客户端如何通过API操作Redis
- Redis客户端API操作
- Redis C客户端API
- Redis C客户端API
- Redis C客户端API
- Redis C客户端API
- Redis客户端API
- Redis如何通过本机客户端访问远程服务器端
- Jedis客户端操作redis
- Redis C客户端API介绍
- Hbase客户端操作api
- Redis客户端API操作 Jedis的八种调用方式详解
- Redis介绍 && Java客户端操作Redis
- Redis介绍 && Java客户端操作Redis
- Redis如何处理客户端连接
- Redis如何处理客户端连接
- Redis 如何处理客户端连接
- Redis 如何处理客户端连接
- 动态链表实例
- Unity3D中uGUI事件系统简述及使用方法总结
- Kinect for Windows 和 Xbox 360比较
- SDOI 2011 染色 树链剖分
- OpenCV图像处理编程实例---(1)图像读取存储保
- 客户端如何通过API操作Redis
- C#中string.format用法详解
- nginx的worker进程间通信
- poj1094——Sorting It All Out(拓扑排序)
- 多维数组
- Erlang(11):进程
- Package already exists. Note: Views might filter empty parent packages.的解决方法
- 声音池 soundpool
- 2.系统开发基础-需求分析(3)