redis内存数据库C客户端hiredis API 中文说明

2023-11-11

A)编译安装

make
make install (/usr/local)
make install PREFIX=$HOME/progs(可以自由指定安装路径)

B)同步的API接口

redisContext *redisConnect(const char *ip, int port);
void *redisCommand(redisContext *c, const char *format, ...);
void freeReplyObject(void *reply);

1)建立连接

redisContext *c = redisConnect("127.0.0.1", 6379);
if (c != NULL && c->err) {
        printf("Error: %s\n", c->errstr);
            // handle error
}

redisConnect函数用来创建一个叫redisContext的东西,它包含了连接相关的信息,它里面有个err字段,0表示正常,其他表示出错了!通过errstr字段可以知晓错误信息。


2)执行命令

reply = redisCommand(context, "SET key value");
reply = redisCommand(context, "SET key %s", value);
reply = redisCommand(context, "SET key %b", value, (size_t) valuelen);
reply = redisCommand(context, "SET key:%s %s", myid, value);

redisCommand的调用格式类似printf函数,上面的第二条调用语句的作用在于输入二进制格式的value内容,其后必须表明二进制的字节长度!


3)redisCommand函数返回一个东西叫redisReply,我们需要通过判断它的type字段来知道返回了具体什么样的内容:

REDIS_REPLY_STATUS      表示状态,内容通过str字段查看,字符串长度是len字段
REDIS_REPLY_ERROR       表示出错,查看出错信息,如上的str,len字段
REDIS_REPLY_INTEGER    返回整数,从integer字段获取值
REDIS_REPLY_NIL            没有数据返回
REDIS_REPLY_STRING      返回字符串,查看str,len字段
REDIS_REPLY_ARRAY       返回一个数组,查看elements的值(数组个数),通过element[index]的方式访问数组元素,每个数组元素是 一个redisReply对象的指针

4)另外有一个类似的函数,批量执行命令:

void *redisCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);

5)redisReply使用完毕后,需要使用函数freeReplyObject进行释放销毁

void redisFree(redisContext *c)的作用是断开连接,并释放redisContext的内容

6)redisCommand的函数执行流程说明:
  a.格式化redis command
  b.格式化后的命令内容放入redisContext的输出缓冲区
  c.调用redisGetReply函数执行命令,得到结果

7)管道的使用方式:
a.填入需要执行的命令

void redisAppendCommand(redisContext *c, const char *format, ...);
void redisAppendCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);

b.获取命令的输出结果

int redisGetReply(redisContext *c, void **reply);

c.释放输出结果

void freeReplyObject(void *reply);


例子:

redisReply *reply = NULL;
redisAppendCommand(context,"set key1 value");
redisAppendCommand(context,"get key2");
redisGetReply(context,&reply); // reply for set
freeReplyObject(reply);
redisGetReply(context,&reply); // reply for get
freeReplyObject(reply);


订阅模式:

reply = redisCommand(context,"SUBSCRIBE test");
freeReplyObject(reply);
while(redisGetReply(context,&reply) == REDIS_OK) {
        // consume message
        freeReplyObject(reply);
}


8)redisReply返回结果处理:
REDIS_OK                    正常
REDIS_ERR_IO          IO读/写出现异常,通过errno查看原因
REDIS_ERR_EOF            服务器关闭了链接,读结束
REDIS_ERR_PROTOCOL  分析redis协议内容出错
EDIS_ERR_OTHER          其他未知的错误
上述错误类型都可以通过redisReply的errstr字段查看简短的描述

C)异步API(异步API的使用方式和同步API差不多,在这儿列出不同的函数吧)
1.连接redis服务器

redisAsyncContext *c = redisAsyncConnect("127.0.0.1", 6379);
if (c->err) {
        printf("Error: %s\n", c->errstr);
            // handle error
}

2.设置连接、断开的钩子函数

int redisAsyncSetConnectCallback(redisAsyncContext *ac, redisConnectCallback *fn);
int redisAsyncSetDisconnectCallback(redisAsyncContext *ac, redisDisconnectCallback *fn);

3.插入命令信息

int redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata,const char *format, ...);
int redisAsyncCommandArgv( redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, int argc, const char **argv, const size_t *argvlen);

获取命令输出和同步API相同


4.关闭连接

void redisAsyncDisconnect(redisAsyncContext *ac);


D)辅助API
下面的API主要用于其他编程语言绑定的术后,可以读取分析数据

redisReader *redisReaderCreate(void);
void redisReaderFree(redisReader *reader);
int redisReaderFeed(redisReader *reader, const char *buf, size_t len);
int redisReaderGetReply(redisReader *reader, void **reply);

 官方例子:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 
 5 #include <hiredis.h>
 6 
 7 int main(int argc, char **argv) {
 8     unsigned int j;
 9     redisContext *c;
10     redisReply *reply;
11     const char *hostname = (argc > 1) ? argv[1] : "127.0.0.1";
12     int port = (argc > 2) ? atoi(argv[2]) : 6379;
13 
14     struct timeval timeout = { 1, 500000 }; // 1.5 seconds
15     c = redisConnectWithTimeout(hostname, port, timeout);
16     if (c == NULL || c->err) {
17         if (c) {
18             printf("Connection error: %s\n", c->errstr);
19             redisFree(c);
20         } else {
21             printf("Connection error: can't allocate redis context\n");
22         }
23         exit(1);
24     }
25 
26     /* PING server */
27     reply = redisCommand(c,"PING");
28     printf("PING: %s\n", reply->str);
29     freeReplyObject(reply);
30 
31     /* Set a key */
32     reply = redisCommand(c,"SET %s %s", "foo", "hello world");
33     printf("SET: %s\n", reply->str);
34     freeReplyObject(reply);
35 
36     /* Set a key using binary safe API */
37     reply = redisCommand(c,"SET %b %b", "bar", (size_t) 3, "hello", (size_t) 5);
38     printf("SET (binary API): %s\n", reply->str);
39     freeReplyObject(reply);
40 
41     /* Try a GET and two INCR */
42     reply = redisCommand(c,"GET foo");
43     printf("GET foo: %s\n", reply->str);
44     freeReplyObject(reply);
45 
46     reply = redisCommand(c,"INCR counter");
47     printf("INCR counter: %lld\n", reply->integer);
48     freeReplyObject(reply);
49     /* again ... */
50     reply = redisCommand(c,"INCR counter");
51     printf("INCR counter: %lld\n", reply->integer);
52     freeReplyObject(reply);
53 
54     /* Create a list of numbers, from 0 to 9 */
55     reply = redisCommand(c,"DEL mylist");
56     freeReplyObject(reply);
57     for (j = 0; j < 10; j++) {
58         char buf[64];
59 
60         snprintf(buf,64,"%d",j);
61         reply = redisCommand(c,"LPUSH mylist element-%s", buf);
62         freeReplyObject(reply);
63     }
64 
65     /* Let's check what we have inside the list */
66     reply = redisCommand(c,"LRANGE mylist 0 -1");
67     if (reply->type == REDIS_REPLY_ARRAY) {
68         for (j = 0; j < reply->elements; j++) {
69             printf("%u) %s\n", j, reply->element[j]->str);
70         }
71     }
72     freeReplyObject(reply);
73 
74     /* Disconnects and frees the context */
75     redisFree(c);
76 
77     return 0;
78 }

 

整理自:http://www.mamicode.com/info-detail-501902.html



FROM:  http://www.cnblogs.com/houjun/p/4875116.html



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

redis内存数据库C客户端hiredis API 中文说明 的相关文章

  • 斯坦福 机器学习-第二章 生成学习算法

    CS229 Lecture notes 原作者 Andrew Ng 吴恩达 翻译 CycleUser Part IV 生成学习算法 Generative Learning algorithms 目前为止 我们讲过的学习算法的模型都是p y
  • java--基础--17.1--线程--实现多线程,线程方法

    java 基础 17 1 线程 实现多线程 线程方法 1 概念 进程 正在运行的程序 每个进程可以由多个线程组成 线程 是进程中的单个顺序控制流 是一条执行路径 并行 指在某一个时间点执行多个任务 并发 指在某一个时间段执行多个任务 2 实
  • 【Android】App开发-动画效果篇

    在我们玩手机的过程中 如果我们点击某一个页面时 会出现一个页面动画加载或者动画效果的现象 现在我们就来看看App开发中是如何实现动画效果的 目录 动画的分类 逐帧动画 补间动画 动画的分类 在常见的app使用的动画中 常见的就是逐帧动画 补
  • confluence安装

    注 安装前确保机器已安装docker 1 执行如下命令一键安装wiki mkdir p data cd data wget http apk lingyun5 com confluence wiki tar gz tar zxvf conf

随机推荐

  • 学习sql,你需要知道这些

    这里写目录标题 数据库的分类 开发式数据库 非开发式数据库 事务 什么是事务 事务的四种特性 死锁 什么是死锁 死锁的四个条件 如何处理死锁 预防死锁 避免死锁 检测死锁 解除死锁 什么是navicat SQL语句 对数据库的操作 对表的操
  • 数字图像处理:使用直方图统计进行图像增强

    一 引言 在 数字图像处理 局部直方图处理 Local Histogram Processing https blog csdn net LaoYuanPython article details 120383974 介绍了基于像素的邻域进
  • 工具类之FastDFSClient

    import org csource common MyException import org csource common NameValuePair import org csource fastdfs import org spri
  • 【GRU时序预测】基于贝叶斯网络优化卷积神经网络结合门控循环单元BO-CNN-GRU实现数据股价预测附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 电力系统 信号
  • c语言 --- 指针

    什么是指针 指针就是一个地址 在c语言中任何东西都是有地址的 如何获取地址 用的是 取地址符 指针就是一个整数 获取指针 定义变量时 可以通过取地址符 得到当前变量的地址 gt 一个房间对应一个房间号 地址类比于房间号 所有的指针类型都是
  • jpa 动态参数查询 高级查询

    GetMapping find ApiOperation 通用查询 ScSecurityPermission name 通用查询 public ScResult find FileInfo fileInfo RequestParam nam
  • JS获取json子项/数组的个数/长度

    JS获取json子项 数组的个数 长度 微信小程序获取json格式数据的个数 长度
  • java 请求参数加解密

    项目开发中 需要针对请求参数加密 解密操作 可以使用下列工具类 oap security enabled true oap security enableIgnoreAnnotation true oap security secretKe
  • [4G/5G/6G专题基础-158]: 5G VoNR(Voice over NR)与VoLTE共同组成5G三大语音方案

    目录 第1章 语音方案概述 1 1 VoLTE概述 1 2 5G VoNR概述 第2章 5G VoNR网络架构 2 1 基本原则 2 2 NSA VoLTE方案 2 3 SA EPS Fallback SA组网 早期方案 2 4 SA Vo
  • 对于售点POI标签计算脚本优化总结

    对于售点POI标签计算脚本性能优化总结 减少udf 函数的使用多多使用spark的算子 对于两组经纬度的距离计算可以使用常规的公式计算法 Haversine 公式是一种用于计算两个球面坐标点 经度和纬度 之间的距离的公式 它的原理是基于球面
  • netpoll浅析

    netpoll只是一种框架和一些接口 只有依赖这个框架和接口实现的netpoll实例 netpoll才能发挥它的功能 类似于kernel中的vfs vfs本身并不会去做具体的文件操作 只是为不同的文件系统提供了一个框架 netpoll不依赖
  • 理解编程中的while循环(C/C++)

    固定的语法结构 省略 include 和 using int main printf x 我们写这个代码 打了一个int main 然后打了一个大括号 为什么要这样做 这个main 是一个函数 但为什么一定要叫main 为什么又需要打 又需
  • JS中的递归

    1 什么是递归 如果一个函数在内部可以调用其本身 那么这个函数就是递归函数 简单理解 函数内部自己调用自己 这个函数就是递归函数 比如 但上面代码报错因为递归很容易发生 栈溢出 错误 stack 所以必须要加退出条件 return 递归必须
  • python读取csv文件内容,并保存到数据库中

    coding utf 8 python读取csv文件内容 并保存到数据库中 import csv import time import pymysql import emoji num 0 file path r H 20221103174
  • 快速掌握 Android Studio 中 Gradle 的使用方法

    Gradle是可以用于Android开发的新一代的 Build System 也是 Android Studio默认的build工具 Gradle脚本是基于一种JVM语言 Groovy 再加上DSL 领域特定语言 组成的 因为Groovy是
  • 81. Search in Rotated Sorted Array II

    31 Search in Rotated Sorted Array ll 描述不包含相同的元素情况 Input nums 4 5 6 7 0 1 2 target 0 Output 4 对有序数组进行一定的旋转 进行查找 二分查找and双指
  • VMware player桥接模式不能联网的解决方法

    VMware虚拟机下主要使用两种网络连接方式 桥接模式 NAT模式 桥接模式 直接连接网络 虚拟机独立IP 并与宿主机处于同一网段内 相当于虚拟机是局域网内独立的一台电脑 使用起来较为方便 NAT模式 网络地址转换 借由宿主机的IP访问网络
  • linux进程间的通信(详细且有demo)

    目录 1 进程间通信常用的几种方式 2 无名管道 1 管道的概念 2 管道的原理 3 管道的局限性 4 创建匿名管道 5 demo 6 父子进程使用管道通信 7 管道的读写行为 8 查看管道缓冲区大小 3 有名管道 1 特点 2使用场景 3
  • VsCode中书写markdown文档快速插入图片

    文章目录 安装插件 插入图片 效果预览 安装插件 搜索 markdown image 安装这个插件 插入图片 首先复制图片 将图片保存在剪贴板中 在需要插入的地址点击鼠标右键 选择粘贴图片 粘贴图片后 会在文件 根路径 下生成一个 imag
  • redis内存数据库C客户端hiredis API 中文说明

    A 编译安装 make make install usr local make install PREFIX HOME progs 可以自由指定安装路径 B 同步的API接口 redisContext redisConnect const