Hiredis 基本使用

转载 2016年06月01日 18:53:57


0. 前言

  Hiredis是一个Redis的C客户端库函数,基本实现了Redis的协议的最小集。这里对hiredis的api作基本的介绍以及应用,主要参考hiredis的README文件以及相关源码。

1. 同步API

redisContext,该库的上下文环境。

 1 /* Context for a connection to Redis */
 2 typedef struct redisContext {
 3     int err; /* Error flags, 0 when there is no error */
 4     char errstr[128]; /* String representation of error when applicable */
 5     int fd;
 6     int flags;
 7     char *obuf; /* Write buffer */
 8     redisReader *reader; /* Protocol reader */
 9 
10     enum redisConnectionType connection_type;
11     struct timeval *timeout;
12 
13     struct {
14         char *host;
15         char *source_addr;
16         int port;
17     } tcp;
18 
19     struct {
20         char *path;
21     } unix_sock;
22 
23 } redisContext;

a. 连接Redis

1 //连接redis,若出错redisContext.err会设置为1,redisContext.errstr会包含描述错误信息
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 */
8 void *redisCommand(redisContext *c, const char *format, ...);
 1 /*
 2 发送一组命令,通过argv以及argvlen指定,当argvlen为NULL时,argv每个字符串的长度通过strlen来计算,所以当需要传输二进制数据时,整个argvlen数据都要输入。
 3 */
 4 void *redisCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);
 5 
 6 /*
 7     Piplining,追加的命令后可以通过redisGetReply来获取命令的返回值。
 8 */
 9 void redisAppendCommand(redisContext *c, const char *format, ...);
10 void redisAppendCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);
11 
12 //获取命令返回值,注:使用freeReplyObject释放
13 int 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返回数据的类型,redisReply.type字段

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结构
2 void freeReplyObject(void *reply);
//关闭连接并释放内存
void redisFree(redisContext *c);

 

e. 错误字段说明 redisContext.err

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 /* Everything else... */

 

2. 异步API

   待补充

 

3. 同步API示例(实现订阅功能)

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include "hiredis.h"
 4 
 5 void ProcessReply( redisReply * pReply )
 6 {
 7     redisReply * pSubReply = NULL;
 8 
 9     if ( pReply != NULL && pReply->elements == 3 )
10     {
11         pSubReply = pReply->element[2];
12         printf( "Msg [%s]\n", pSubReply->str );
13     }
14 }
15 
16 int main( int argc, char const *argv[] )
17 {
18     redisContext * pContext = redisConnect( "127.0.0.1", 6379 );
19 
20     if ( NULL == pContext || pContext->err == 1 )
21     {
22         printf( "%s\n", pContext->errstr );
23         exit( -1 );
24     }
25 
26     char * pKey = "DATABUS:REQ";
27 
28     redisReply * pReply = redisCommand( pContext, "SUBSCRIBE %s", pKey );
29     freeReplyObject( pReply );
30     while ( redisGetReply( pContext, (void **)&pReply ) == REDIS_OK )
31     {
32         ProcessReply( pReply );
33         freeReplyObject( pReply );
34     }
35 
36     redisFree( pContext );
37 
38     return 0;
39 }

Redis C语言客户端库hiredis文档翻译

Hiredis是redis数据库一个轻量的C语言客户端库。 之所以轻量是由于它只是简单的提供了对redis操作语句支持的接口,并没有实现具体的操作语句的功能。但正是由于这种设计使我们只要熟悉了通用的...
  • IT_small_farmer
  • IT_small_farmer
  • 2014年12月04日 16:27
  • 7519

Redis c API

Hiredis是redis数据库一个轻量的C语言客户端库。 之所以轻量是由于它只是简单的提供了对redis操作语句支持的接口,并没有实现具体的操作语句的功能。但正是由于这种设计使我们只要熟悉了通用的r...
  • u010064842
  • u010064842
  • 2015年03月18日 21:11
  • 1014

Linux redis快速使用

一、 redis 主页:http://www.redis.io/ 可以在该页面的 Download it处点击,下载最新版本。 本篇依赖的版本为:Redis 2.8.13...
  • henuyx
  • henuyx
  • 2014年08月03日 21:05
  • 11715

redis的一些坑

from:http://my.oschina.net/u/875730/blog/378086 0 redis跨机房使用问题   一般地,redis的每个实例都是一个master加上一个sla...
  • Real_Myth
  • Real_Myth
  • 2015年08月06日 16:38
  • 2493

C++中使用hiredis

hiredis是redis数据库的C接口,目前只能在linux下使用,几个基本的函数就可以操作redis数据库了。 1、redisContext* redisConnect(const char...
  • szchtx
  • szchtx
  • 2014年03月21日 20:44
  • 16567

redis C接口hiredis 简单函数使用介绍

from : http://blog.csdn.net/kingqizhou/article/details/8104693 hiredis是redis数据库的C接口,目前只能在linux下...
  • mniwc
  • mniwc
  • 2013年10月18日 13:41
  • 36533

redis和hiredis-master使用心得

redis的安装,使用ubuntu环境 使用了两种方式, 一种是apt-get install redi-sever 简单方便,但是没有源码 一种是从redis.io上下载最新的packag...
  • roomcxj
  • roomcxj
  • 2015年09月15日 13:20
  • 826

hiredis的一些使用心得

最近公司的一个后台项目使用的cache模块,由于使用的是公司内部开发的一套分布式的系统,系统由于年代比较久远,也已经没有人员进行维护了,出了问题便无人懂得如何维护,也没有相应的文档,便最近想办法使用一...
  • dreamvyps
  • dreamvyps
  • 2015年03月25日 20:17
  • 7181

Hiredis 实现 Redis 流水线

Pipelining(流水线)允许 Redis 客户端一次向 Redis 发送多个命令,Redis 在接收到这些命令后,按顺序进行处理,然后将请求的处理结果一次性返回给客户端。流水线可以减少客户端与 ...
  • lihao21
  • lihao21
  • 2017年06月10日 11:21
  • 2546

linux下的hiredis的安装和使用(一)

1、linux下如何安装hiredis 1)下载地址  https://github.com/redis/hiredis 2)编译和安装 解压后的文件夹执行 make;make install; 3)...
  • Aresiii
  • Aresiii
  • 2016年01月23日 10:04
  • 8703
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hiredis 基本使用
举报原因:
原因补充:

(最多只允许输入30个字)