Hiredis库的简单使用
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库的简单使用相关推荐
- c++使用hiredis库操作redis讲解
做服务端开发基本都会用到redis,java调用redis就简单了,教程很多,库也都是现成的,多数会选择jedis库吧,但是c++调用redis就麻烦一点,基本都要自己编译才行.虽然支持 ...
- python对逻辑回归进行显著性_python sklearn库实现简单逻辑回归的实例代码
Sklearn简介 Scikit-learn(sklearn)是机器学习中常用的第三方模块,对常用的机器学习方法进行了封装,包括回归(Regression).降维(Dimensionality Red ...
- python wpf教程_WPF使用IronPython库的简单Demo
WPF使用IronPython库的简单Demo 一.IronPython和C#交互 IronPython是一个.NET平台上的Python实现,包括了完整的编译器.执行引擎与运行时支持,能够与.NET ...
- python如何安装panda数据库_在Pycharm中安装Pandas库方法(简单易懂)
开发环境的搭建是一件入门比较头疼的事情,在上期的文稿基础上,增加一项Anaconda的安装介绍.Anaconda是Python的一个发行版本,安装好了Anaconda就相当于安装好了Python,并且 ...
- php中GD库的简单使用
在php中需要图像处理的地方GD库会发挥重要的作用,php可以创建并处理包括GIF,PNG,JPEG,WBMP以及XPM在内的多种图像格式,简单的举几个例子: 1.用GD库会创建一块空白图片,然后绘制 ...
- python123九宫格输入_使用python PIL库实现简单验证码的去噪方法步骤
字符型图片验证码识别完整过程及Python实现的博主,我的大部分知识点都是从他那里学来的. 想要识别验证码,收集足够多的样本后,首先要做的就是对验证码原始图片进行处理,对验证码识别分类之前,一般包括: ...
- python jieba库分词_Python基于jieba库进行简单分词及词云功能实现方法
本文实例讲述了Python基于jieba库进行简单分词及词云功能实现方法.分享给大家供大家参考,具体如下: 目标: 1.导入一个文本文件 2.使用jieba对文本进行分词 3.使用wordcloud包 ...
- python中的turtle如何运行_python中turtle库的简单使用教程
python的turtle库的简单使用 Python的turtle库是一个直观有趣的图形绘制函数库,是python的标准库之一. 一.绘图坐标体系 turtle库绘制图形的基本框架:通过一个小海龟在坐 ...
- Python之Turtle库绘制简单图形
Python之Turtle库绘制简单图形 来绘制正方形.三角形.五边形.五角形 import turtle #引入turtle库pen=turtle.Turtle() #创建turtle类型的画笔 # ...
最新文章
- .htaccess:正则表达式、重定向代码
- ASP 投票系统所用技术小结
- 【Python】高级函数lambda函数
- MyBatis-04 MyBatis XML方式之insert元素
- 二十七、深入==与equals的区别(下篇)
- 用proxool配置数据库连接池步骤
- OpenResty请求参数处理
- stream常用操作
- ui设计移动端字体适配_手机端页面UI设计尺寸和字体大小规范
- javafx 二维图形编程及可视化操作
- 逻辑数据库设计 - 可变属性(继承)
- 程序员通过什么渠道接外包项目
- 小米平板2 Windows刷回MIUI9线刷教程(2019)
- Stellarium:Compile with MSVC2012 and Qt5 (OpenGL)
- C预处理器和C函数库
- android简易播放器2:activity和service同步显示
- Kylin高级主题-Cube构建算法介绍(逐层算法和快速算法)
- 分布式基础-谁来当老大(二)
- Mysql的收费方式
- PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
热门文章
- [python-图像处理]python图片处理技巧[基本操作]
- 天气预报开放API调用
- J2EE 字符 字节 编码知识概念
- Java多线程设计模式(1)
- C#中全角与半角的转换
- 如何在page_load方法判断是服务器端控件引发的page_load方法
- VS+QT和qtcreator工程的互相转换
- 数据降维(PCA、KPCA、PPCA)及C++实现
- Go语言goroutine+channel+select简介
- android Button 监听的几种方式