Hiredis基本使⽤
0. 前⾔
  Hiredis是⼀个Redis的C客户端库函数,基本实现了Redis的协议的最⼩集。这⾥对hiredis的api作基本的介绍以及应⽤,主要参考hiredis的README⽂件以及相关源码。
1. 同步API
redisContext,该库的上下⽂环境。
1/* Context for a connection to Redis */
2 typedef struct redisContext {
3int err; /* Error flags, 0 when there is no error */
4char errstr[128]; /* String representation of error when applicable */
5int fd;
6int flags;
7char *obuf; /* Write buffer */
8    redisReader *reader; /* Protocol reader */
9
10enum redisConnectionType connection_type;
11struct timeval *timeout;
12
13struct {
14char *host;
15char *source_addr;
16int port;
17    } tcp;
18
19struct {
20char *path;
21    } unix_sock;
22
23 } redisContext;
a. 连接Redis
1//连接redis,若出错会设置为1,str会包含描述错误信息
2 redisContext *redisConnect(const char *ip, int port);
b. 同步执⾏Redis命令
1/*
2
3同步执⾏redis命令,和printf类似,%b传⼊⼆进制数据,要求有size_t参数指定长度。例如redisCommmand( c, "SET foo %b", arr, (size_t)len );
4失败:返回NULL,并且err字段会置1,⼀旦执⾏出错,该redisContext就不能再使⽤,需要重新连接
5成功:返回redisReply的指针
6
7*/
8void *redisCommand(redisContext *c, const char *format, ...);
1/*
2发送⼀组命令,通过argv以及argvlen指定,当argvlen为NULL时,argv每个字符串的长度通过strlen来计算,所以当需要传输⼆进制数据时,整个argvlen数据都要输⼊。 3*/
define的基本用法
4void *redisCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);
5
6/*
7    Piplining,追加的命令后可以通过redisGetReply来获取命令的返回值。
8*/
9void redisAppendCommand(redisContext *c, const char *format, ...);
10void redisAppendCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);
11
12//获取命令返回值,注:使⽤freeReplyObject释放
13int redisGetReply(redisContext *c, void **reply);
c. 响应的数据结构
typedef struct redisReply {
  int type; /* REDIS_REPLY_* *///指明返回的类型
  long long integer; /* The integer when type is REDIS_REPLY_INTEGER */
  int 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;
Redis返回数据的类型,pe字段
1#define REDIS_REPLY_STRING 1 //字符串
2#define REDIS_REPLY_ARRAY 2    //数组,多个reply,通过element数组以及elements数组⼤⼩访问
3#define REDIS_REPLY_INTEGER 3    //整型, integer字段
4#define REDIS_REPLY_NIL 4    //空,没有数据
5#define REDIS_REPLY_STATUS 5    //状态,str字符串以及len
6#define REDIS_REPLY_ERROR 6    //错误,同STATUS
d. 释放资源
1//释放reply结构
2void freeReplyObject(void *reply);
//关闭连接并释放内存
void redisFree(redisContext *c);
e. 错误字段说明
1//错误字段,会设置为以下其中⼀个值
2#define REDIS_ERR_IO 1 /* Error in read or write */
3#define REDIS_ERR_EOF 3 /* End of file */
4#define REDIS_ERR_PROTOCOL 4 /* Protocol error */
5#define REDIS_ERR_OOM 5 /* Out of memory */
6#define REDIS_ERR_OTHER 2 /* */
2. 异步API
  待补充
3. 同步API⽰例(实现订阅功能)
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "hiredis.h"
4
5void ProcessReply( redisReply * pReply )
6 {
7    redisReply * pSubReply = NULL;
8
9if ( pReply != NULL && pReply->elements == 3 )
10    {
11        pSubReply = pReply->element[2];
12        printf( "Msg [%s]\n", pSubReply->str );
13    }
14 }
15
16int main( int argc, char const *argv[] )
17 {
18    redisContext * pContext = redisConnect( "127.0.0.1", 6379 );
19
20if ( NULL == pContext || pContext->err == 1 )
21    {
22        printf( "%s\n", pContext->errstr );
23        exit( -1 );
24    }
25
26char * pKey = "DATABUS:REQ";
27
28    redisReply * pReply = redisCommand( pContext, "SUBSCRIBE %s", pKey );
29    freeReplyObject( pReply );
30while ( redisGetReply( pContext, (void **)&pReply ) == REDIS_OK )
31    {
32        ProcessReply( pReply );
33        freeReplyObject( pReply );
34    }
35
36    redisFree( pContext );
37
38return0;
39 }
运⾏结果如下:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。