Hiredis是一个Redis的C客户端库函数,基本实现了Redis的协议的最小集。这里对hiredis的api作基本的介绍以及应用,主要参考hiredis的README文件以及相关源码。
1. hiredis的安装
也可以直接将文件编译到自己的工程代码。
2. 同步API接口的使用
/连接数据库*/ redisContext *redisConnect(const char *ip, int port); /发送命令请求*/ void *redisCommand(redisContext *c, const char *format, ...); void *redisCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen); void redisAppendCommand(redisContext *c, const char *format, ...); void redisAppendCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen); /*释放资源*/ void freeReplyObject(void *reply); void redisFree(redisContext *c);
2.1连接redis数据库redisConnect
函数原型
redisContext *redisConnect(const char *ip, int port);
参数说明
返回值
返回值是一个指向redisContext对象,可以不用了解这个对象的具体组成部分,只需要知道怎么使用就可以了。下面是其定义。
typedef struct redisContext {
int err; /* Error flags, 0 when there is no error */ char errstr[128]; /* String representation of error when applicable */ int fd; int flags; char *obuf; /* Write buffer */ redisReader *reader; /* Protocol reader */ enum redisConnectionType connection_type; struct timeval *timeout; struct {
char *host; char *source_addr; int port; } tcp; struct {
char *path; } unix_sock; } redisContext;
使用例子
redisContext *c = redisConnect("127.0.0.1", 6379); if (c == NULL || c->err) {
if (c) {
printf("Error: %s\n", c->errstr); // handle error } else {
printf("Can't allocate redis context\n"); } }
这个redisContext不是一个线程安全的对象,也就是说,多个线程同时访问这一个对象可能会出现问题。
2.2 发送需要执行的命令redisCommand
发送命令函数原型
redisCommand
void *redisCommand(redisContext *c, const char *format, ...);
参数说明
返回值
/* This is the reply object returned by 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;
返回结果的类型reply->type,reply 为redisReply* 类型。
- REDIS_REPLY_STRING == 1:返回值是字符串,字符串储存在
redis->str当中,字符串长度为redis->len。 - REDIS_REPLY_ARRAY == 2:返回值是数组,数组大小存在
redis->elements里面,数组值存储在redis->element[i]里面。数组里面存储的是指向redisReply的指针,数组里面的返回值可以通过redis->element[i]->str来访问,数组的结果里全是type==REDIS_REPLY_STRING的redisReply对象指针。 - REDIS_REPLY_INTEGER == 3:返回值为整数 long long。
- REDIS_REPLY_NIL==4:返回值为空表示执行结果为空。
- REDIS_REPLY_STATUS ==5:返回命令执行的状态,比如set foo bar 返回的状态为OK,存储在str当中
reply->str== “OK”。 - REDIS_REPLY_ERROR ==6 :命令执行错误,错误信息存放在
reply->str当中。
redisCommandArgv函数
函数原型
void *redisCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);
参数说明
char hkey[] = ""; char hset[] = "hset"; char key[] = "testkey"; char hvalue[] = "3210"; int argc = 4; char *argv[] = {
hset,key,hkey,hvalue}; size_t argvlen[] = {
4,6,4,3}; redisCommandArgv(context,argc,argv,argvlen);
redisAppendCommand*函数支持管道命令
函数原型:
void redisAppendCommand(redisContext *c, const char *format, ...); void redisAppendCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen); int redisGetReply(redisContext *context,redisReply** reply);
参数说明:
使用例子:
redisReply *reply; /*添加命令set */ redisAppendCommand(context,"SET foo bar"); /*添加命令get */ redisAppendCommand(context,"GET foo"); /*获取set命令结果*/ redisGetReply(context,&reply); // reply for SET freeReplyObject(reply); /*获取get命令结果*/ redisGetReply(context,&reply); // reply for GET freeReplyObject(reply);
2.3 释放资源
函数原型
void freeReplyObject(void *reply); void redisFree(redisContext *c);
参数说明
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202811.html原文链接:https://javaforall.net
