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 }

运行结果如下:

Hiredis库的简单使用相关推荐

  1. c++使用hiredis库操作redis讲解

           做服务端开发基本都会用到redis,java调用redis就简单了,教程很多,库也都是现成的,多数会选择jedis库吧,但是c++调用redis就麻烦一点,基本都要自己编译才行.虽然支持 ...

  2. python对逻辑回归进行显著性_python sklearn库实现简单逻辑回归的实例代码

    Sklearn简介 Scikit-learn(sklearn)是机器学习中常用的第三方模块,对常用的机器学习方法进行了封装,包括回归(Regression).降维(Dimensionality Red ...

  3. python wpf教程_WPF使用IronPython库的简单Demo

    WPF使用IronPython库的简单Demo 一.IronPython和C#交互 IronPython是一个.NET平台上的Python实现,包括了完整的编译器.执行引擎与运行时支持,能够与.NET ...

  4. python如何安装panda数据库_在Pycharm中安装Pandas库方法(简单易懂)

    开发环境的搭建是一件入门比较头疼的事情,在上期的文稿基础上,增加一项Anaconda的安装介绍.Anaconda是Python的一个发行版本,安装好了Anaconda就相当于安装好了Python,并且 ...

  5. php中GD库的简单使用

    在php中需要图像处理的地方GD库会发挥重要的作用,php可以创建并处理包括GIF,PNG,JPEG,WBMP以及XPM在内的多种图像格式,简单的举几个例子: 1.用GD库会创建一块空白图片,然后绘制 ...

  6. python123九宫格输入_使用python PIL库实现简单验证码的去噪方法步骤

    字符型图片验证码识别完整过程及Python实现的博主,我的大部分知识点都是从他那里学来的. 想要识别验证码,收集足够多的样本后,首先要做的就是对验证码原始图片进行处理,对验证码识别分类之前,一般包括: ...

  7. python jieba库分词_Python基于jieba库进行简单分词及词云功能实现方法

    本文实例讲述了Python基于jieba库进行简单分词及词云功能实现方法.分享给大家供大家参考,具体如下: 目标: 1.导入一个文本文件 2.使用jieba对文本进行分词 3.使用wordcloud包 ...

  8. python中的turtle如何运行_python中turtle库的简单使用教程

    python的turtle库的简单使用 Python的turtle库是一个直观有趣的图形绘制函数库,是python的标准库之一. 一.绘图坐标体系 turtle库绘制图形的基本框架:通过一个小海龟在坐 ...

  9. Python之Turtle库绘制简单图形

    Python之Turtle库绘制简单图形 来绘制正方形.三角形.五边形.五角形 import turtle #引入turtle库pen=turtle.Turtle() #创建turtle类型的画笔 # ...

最新文章

  1. .htaccess:正则表达式、重定向代码
  2. ASP 投票系统所用技术小结
  3. 【Python】高级函数lambda函数
  4. MyBatis-04 MyBatis XML方式之insert元素
  5. 二十七、深入==与equals的区别(下篇)
  6. 用proxool配置数据库连接池步骤
  7. OpenResty请求参数处理
  8. stream常用操作
  9. ui设计移动端字体适配_手机端页面UI设计尺寸和字体大小规范
  10. javafx 二维图形编程及可视化操作
  11. 逻辑数据库设计 - 可变属性(继承)
  12. 程序员通过什么渠道接外包项目
  13. 小米平板2 Windows刷回MIUI9线刷教程(2019)
  14. Stellarium:Compile with MSVC2012 and Qt5 (OpenGL)
  15. C预处理器和C函数库
  16. android简易播放器2:activity和service同步显示
  17. Kylin高级主题-Cube构建算法介绍(逐层算法和快速算法)
  18. 分布式基础-谁来当老大(二)
  19. Mysql的收费方式
  20. PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC

热门文章

  1. [python-图像处理]python图片处理技巧[基本操作]
  2. 天气预报开放API调用
  3. J2EE 字符 字节 编码知识概念
  4. Java多线程设计模式(1)
  5. C#中全角与半角的转换
  6. 如何在page_load方法判断是服务器端控件引发的page_load方法
  7. VS+QT和qtcreator工程的互相转换
  8. 数据降维(PCA、KPCA、PPCA)及C++实现
  9. Go语言goroutine+channel+select简介
  10. android Button 监听的几种方式