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. 【redis】c/c++操作redis(对于hiredis的封装)

    前言 最近一直在学习redis,通过c/cpp来执行redis命令,使用的是hiredis客户端来实现的. 先简单贴一下代码 头文件 #include <vector> #include ...

  2. Linux 下的hiredis的简单安装、测试*(转)

    上一章介绍的是如何安装Redis以及在Redis客户端上进行简单测试,但是我们一般安装完Redis之后,都是要结合编程语言对其进行应用的,hiredis是redis开源库对外发布的客户端API包,这一 ...

  3. hiredis — Redis 的 C 语言客户端

    目录 文章目录 目录 Redis 客户端 HIREDIS 安装 验证 Synchronous API redisConnect redisCommand freeReplyObject redisFr ...

  4. redis c客户端 hiredis

    1.简单介绍 hiredis是一个轻量级的访问redis数据库的c客户端. 它是轻量级的不仅仅是因为它仅仅提供对协议的最小支持,而且它使用了一个高级别的极度类似于printf的api使它的级别远高于其 ...

  5. Hiredis库的简单使用

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

  6. windows下redis 和 hiredis的编译与使用

    编译环境,32位windows7,VS2013 获取redis windows版 MS Open Technologies 官方主页 GitHub上的MSOpenTech/redis项目地址 编译 r ...

  7. C++通过hiredis连接到redis

    1 实现功能 1.1 在Linux下通过C++代码调用hiredis的接口,实现连接: 1.2 在redis里面建立Hash类型值: 1.3 从数据库中取出数据 执行之前需要安装redis的调用接口h ...

  8. 记录发现的一个hiredis的bug

    hiredis是redis官方提供的c客户端库.在读代码的过程中,发现了一个bug,记录一下. hiredis里定义了一个上下文结构(struct redisContext),代码如下(deps/hi ...

  9. c++中使用 hiredis/hiredis.h

    hiredis是redis开源库对外发布的客户端API包. 当redis-server配置启动后,可以通过hiredis操作redis资源. 几个基本的函数就可以操作redis数据库 /* 作用:用于 ...

  10. hiredis封装事务示例

    简言 1. redis的事务在使用时有诸多限制,且不是真正的事务(因为无法保证原子性,出错时也不能回滚),不建议使用 2. 具体redis事务的总结,请看笔者的这篇博客 https://blog.cs ...

最新文章

  1. SQL压力测试用的语句和相关计数器
  2. php制作表格生成器,php表格生成图片.doc
  3. 【杂谈】为什么你学了AI,企业却不要你
  4. (d2l-ai/d2l-zh)《动手学深度学习》pytorch 笔记(2)前言(介绍各种机器学习问题)以及数据操作预备知识Ⅰ
  5. BBR在实时音视频领域的应用
  6. python去重复的数据_Python中mysql查询重复数据并删除重复数据
  7. markdown学习/mou
  8. Cage验证码生成器快速上手
  9. Java 获取文件的上级目录
  10. 老外看中国:本土移动应用差异在哪?
  11. 再学 GDI+[16]: GDI+ 的颜色常量表
  12. Vue子组件调用父组件的方法
  13. 关于wxwidgets图形界面的关闭窗口的按钮无效的解决办法
  14. 中鸣机器人编程教程 c 语言,中鸣教育机器人简介.doc
  15. [Java]方法递归——经典案例
  16. 二元关系的矩阵和图表示
  17. Vue 实现PC端和移动端的自适应
  18. npm install很慢(奇葩)解决方法
  19. 如何利用CCleaner快速查找重复文件?
  20. nginx配置和优化详解

热门文章

  1. 面试题总结:volatile的功能
  2. MyBatis 多表关联查询
  3. C#【控件篇】按Tab键可以跳转到下个控件(TabIndex、TabStop的设置)
  4. plc和c语言谁的前景好,PLC面向对象编程和梯形图逻辑,到底谁更实用一些?
  5. Ubuntu 键盘鼠标失效解决办法
  6. java.util. 什么意思_java.util中,util是什么意义
  7. Web 图集应用,属于非游戏类的图集/雪碧图对象/JS雪碧图/前端图集/JS图集
  8. 2,JESD204为什么值得关注?
  9. html 复选框 不能编辑,javascript-jqGrid-复选框编辑无法编辑所选行
  10. 按键精灵自动登录网站范例源码