hiredis: 一个轻量级、高性能的 C 语言 Redis 客户端库

目录

1.简介

2.安装和配置

2.1.源码编译安装(通用方法)

2.2.包管理器安装(特定系统)

2.3.Windows 安装

3.常用的函数及功能

3.1.连接管理函数

3.2.命令执行函数

3.3.异步操作函数

3.4.回复处理函数

3.5.错误处理

3.6.连接池与线程安全

4.编译与链接

5.常见用法

6.应用场景

7.注意事项


1.简介

        hiredis 是一个轻量级、高性能的 C 语言 Redis 客户端库,用于与 Redis 数据库进行通信。它提供了简洁的 API,支持同步 / 异步操作、管道(pipelining)、事务(transactions)等特性,被广泛应用于需要与 Redis 交互的 C/C++ 项目中。

下载地址:https://github.com/redis/hiredis

        它的核心特征有:

  1. 轻量级:仅包含几个源文件和头文件,无外部依赖,易于集成。
  2. 高性能:基于非阻塞 I/O,支持批量操作(管道)和异步回调。
  3. 完整的 Redis 协议实现:支持所有 Redis 命令和数据类型。
  4. 线程安全:通过连接池或每个线程独立连接实现线程安全。
  5. 异步事件驱动:可与 libevent、libev 等事件库集成,适合高并发场景。

2.安装和配置

2.1.源码编译安装(通用方法)

步骤 1:获取源码

git clone https://github.com/redis/hiredis.git
cd hiredis

步骤 2:编译与安装

make        # 编译库
make test   # (可选)运行测试
sudo make install  # 安装到系统目录(默认:/usr/local/lib 和 /usr/local/include)

步骤 3:更新动态链接库缓存(Linux 系统)

sudo ldconfig

2.2.包管理器安装(特定系统)

1.Ubuntu/Debian

sudo apt-get install libhiredis-dev

2.CentOS/RHEL

sudo yum install hiredis-devel

3.macOS (via Homebrew)

brew install hiredis

2.3.Windows 安装

方法 1:使用 vcpkg(推荐)

git clone https://github.com/microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat
.\vcpkg install hiredis

方法 2:手动编译(MinGW/MSYS2)

1.安装 MSYS2 并更新:

pacman -Syu

2.安装编译工具链和依赖:

pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake

3.编译 hiredis:

git clone https://github.com/redis/hiredis.git
cd hiredis
make CC=x86_64-w64-mingw32-gcc

方法 3:CMake编译

参考:Windows下通过CMake编译hiredis及应用_hiredis windows-CSDN博客

3.常用的函数及功能

Hiredis 提供了一系列用于与 Redis 服务器通信的函数,主要分为连接管理命令执行异步操作辅助工具四大类。以下是常用函数及其功能的详细介绍:

3.1.连接管理函数

redisConnect:创建同步连接到 Redis 服务器。

//函数声明
redisContext *redisConnect(const char *ip, int port);//示例
redisContext *ctx = redisConnect("127.0.0.1", 6379);
if (ctx->err) {printf("Connection error: %s\n", ctx->errstr);
}

redisConnectWithTimeout:创建同步连接并设置超时时间。

redisContext *redisConnectWithTimeout(const char *ip, int port, struct timeval timeout);

redisFree:释放 Redis 连接上下文。

void redisFree(redisContext *c);

3.2.命令执行函数

redisCommand:执行 Redis 命令并返回结果。

//函数声明
redisReply *redisCommand(redisContext *c, const char *format, ...);//示例
redisReply *reply = redisCommand(ctx, "SET key %s", "value");
if (reply->type == REDIS_REPLY_STATUS) {printf("SET result: %s\n", reply->str);
}
freeReplyObject(reply);  // 释放回复对象

redisCommandArgv:以参数数组形式执行 Redis 命令(避免字符串格式化问题)。

//函数声明
redisReply *redisCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);//示例
const char *argv[3] = {"SET", "key", "value"};
size_t argvlen[3] = {3, 3, 5};
redisReply *reply = redisCommandArgv(ctx, 3, argv, argvlen);

redisAppendCommand:将命令添加到输出缓冲区(用于管道)。

int redisAppendCommand(redisContext *c, const char *format, ...);

redisGetReply:从输入缓冲区获取命令回复(用于管道)。

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

3.3.异步操作函数

redisAsyncConnect:创建异步连接到 Redis 服务器。

redisAsyncContext *redisAsyncConnect(const char *ip, int port);

redisAsyncSetConnectCallback:设置连接成功 / 失败的回调函数。

void redisAsyncSetConnectCallback(redisAsyncContext *ac, redisConnectCallback *fn);

redisAsyncCommand:异步执行 Redis 命令。

//函数声明
int redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, const char *format, ...);//示例
void getCallback(redisAsyncContext *ac, void *r, void *privdata) {redisReply *reply = r;printf("GET result: %s\n", reply->str);
}redisAsyncCommand(ac, getCallback, NULL, "GET key");

redisAsyncDisconnect:断开异步连接。

void redisAsyncDisconnect(redisAsyncContext *ac);

3.4.回复处理函数

freeReplyObject:释放 Redis 回复对象,防止内存泄漏。

void freeReplyObject(void *reply);

3.5.错误处理

redisContext.err 和 redisContext.errstr:检查连接错误和错误信息。

if (ctx->err) {printf("Error: %s\n", ctx->errstr);
}

3.6.连接池与线程安全

Hiredis 本身不是线程安全的,但可通过以下方式实现线程安全:

1)每个线程独立连接:为每个线程创建单独的 redisContext

2)连接池:管理多个 redisContext 实例,线程需要时从池中获取。

4.编译与链接

编译时需链接 hiredis 库:

gcc your_file.c -o your_program -lhiredis

5.常见用法

1.同步连接与命令执行

#include <hiredis/hiredis.h>int main() {// 连接到 Redis 服务器redisContext *ctx = redisConnect("127.0.0.1", 6379);if (ctx == NULL || ctx->err) {printf("Connection error: %s\n", ctx ? ctx->errstr : "NULL");return 1;}// 执行命令(SET key value)redisReply *reply = redisCommand(ctx, "SET %s %s", "key", "value");if (reply) {freeReplyObject(reply);  // 释放回复对象}// 执行命令(GET key)reply = redisCommand(ctx, "GET %s", "key");if (reply && reply->type == REDIS_REPLY_STRING) {printf("GET key: %s\n", reply->str);freeReplyObject(reply);}// 断开连接redisFree(ctx);return 0;
}

2.管道(Pipelining)

批量发送命令以减少网络往返:

redisAppendCommand(ctx, "SET key1 value1");
redisAppendCommand(ctx, "SET key2 value2");
redisAppendCommand(ctx, "GET key1");
redisAppendCommand(ctx, "GET key2");// 获取所有回复
redisReply *reply;
redisGetReply(ctx, (void**)&reply); freeReplyObject(reply);
redisGetReply(ctx, (void**)&reply); freeReplyObject(reply);
redisGetReply(ctx, (void**)&reply); printf("key1: %s\n", reply->str); freeReplyObject(reply);
redisGetReply(ctx, (void**)&reply); printf("key2: %s\n", reply->str); freeReplyObject(reply);

3.异步操作(基于 libevent)

#include <hiredis/async.h>
#include <hiredis/adapters/libevent.h>// 回调函数
void getCallback(redisAsyncContext *ac, void *r, void *privdata) {redisReply *reply = r;if (reply == NULL) return;printf("GET result: %s\n", reply->str);
}int main() {struct event_base *base = event_base_new();redisAsyncContext *ac = redisAsyncConnect("127.0.0.1", 6379);// 设置事件循环redisLibeventAttach(ac, base);// 设置连接回调redisAsyncSetConnectCallback(ac, connectCallback);redisAsyncSetDisconnectCallback(ac, disconnectCallback);// 异步执行命令redisAsyncCommand(ac, getCallback, NULL, "GET key");// 启动事件循环event_base_dispatch(base);// 清理资源redisAsyncFree(ac);event_base_free(base);return 0;
}

6.应用场景

  • 缓存系统:作为 Redis 客户端,实现数据缓存。
  • 实时统计:利用 Redis 的原子操作实现计数器、排行榜等。
  • 消息队列:结合 Redis 的 LIST 或 STREAM 实现消息队列。
  • 分布式锁:使用 Redis 的 SETNX 或 SET ... NX 实现分布式锁。

7.注意事项

1.内存管理:每次调用 redisCommand() 或 redisGetReply() 后,需通过 freeReplyObject() 释放回复对象。

2.线程安全redisContext 非线程安全,多线程环境需为每个线程创建独立连接或使用连接池。

3.异步回调:异步模式下,回调函数会在事件循环线程中执行,需注意线程安全。

掌握hiredis的接口函数后,你可以根据项目需求选择同步或异步方式与 Redis 服务器交互,实现缓存、消息队列等功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914190.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP套接字

1.概念套接字是专门进行网络间数据通信的一种文件类型&#xff0c;可以实现不同主机之间双向通信&#xff0c;包含了需要交换的数据和通信双方的IP地址和port端口号。2.套接字文件的创建int socket(int domain, int type, int protocol); 功能&#xff1a;该函数用来创建各种各…

Go语言高并发聊天室(一):架构设计与核心概念

Go语言高并发聊天室&#xff08;一&#xff09;&#xff1a;架构设计与核心概念 &#x1f680; 引言 在当今互联网时代&#xff0c;实时通信已成为各类应用的核心功能。从微信、QQ到各种在线协作工具&#xff0c;高并发聊天系统的需求无处不在。本系列文章将手把手教你使用Go语…

Java基础:泛型

什么是泛型&#xff1f; 简单来说&#xff0c;Java泛型是JDK 5引入的一种特性&#xff0c;它允许你在定义类、接口和方法时使用类型参数&#xff08;Type Parameters&#xff09;。这些类型参数可以在编译时被具体的类型&#xff08;如 String, Integer, MyCustomClass 等&…

RMSNorm实现

当前Qwen、Llama等系列RMSNorm实现源码均一致。具体现实如下&#xff1a; class RMSNorm(nn.Module):def __init__(self, hidden_size, eps1e-6):super().__init__()self.weight nn.Parameter(torch.ones(hidden_size))self.variance_epsilon epsdef forward(self, hidden_s…

智能Agent场景实战指南 Day 11:财务分析Agent系统开发

【智能Agent场景实战指南 Day 11】财务分析Agent系统开发 文章标签 AI Agent,财务分析,LLM应用,智能财务,Python开发 文章简述 本文是"智能Agent场景实战指南"系列第11篇&#xff0c;聚焦财务分析Agent系统的开发。文章深入解析如何构建一个能够自动处理财务报表…

人工智能安全基础复习用:可解释性

一、可解释性的核心作用1. 错误检测与模型改进发现模型的异常行为&#xff08;如过拟合、偏见&#xff09;&#xff0c;优化性能。例&#xff1a;医疗模型中&#xff0c;可解释性帮助识别误诊原因。2. 安全与可信性关键领域&#xff08;医疗、军事&#xff09;需透明决策&#…

Qt:QCustomPlot类介绍

QCustomPlot的核心类就是QCustomPlot类。这个类继承自QWidget&#xff0c;因此可以像其他QWidget一样使用&#xff0c;比如放入布局中。QCustomPlot类基本结构一个QCustomPlot对象可以包含多个图层&#xff08;通过QCPLayer表示&#xff09;&#xff0c;通常使用默认图层。它包…

Visual Studio 2022 上使用ffmpeg

目录 1. 添加包含目录 2. 添加库目录 3. 添加依赖项 4. 添加动态库目录 5. 测试 在解决方案中右击项目名称&#xff0c;弹出的窗口中选择 "属性"。 1. 添加包含目录 "C/C" -> "常规" -> "附加包含目录"中添加 ffmpeg中的…

Elasticsearch 线程池

Elasticsearch 线程池「每个线程池到底采用哪种实现策略」&#xff1a;Elasticsearch 线程池&#xff08;ThreadPool&#xff09;中 **所有内置线程池名称的常量定义**。 每个字符串常量对应一个 **线程池的名字&#xff08;name&#xff09;**&#xff0c;也就是你在 Thread…

深入理解 Next.js API 路由:构建全栈应用的终极指南

Next.js 是一个强大的 React 框架&#xff0c;不仅支持服务端渲染&#xff08;SSR&#xff09;和静态站点生成&#xff08;SSG&#xff09;&#xff0c;还提供了内置的 API 路由功能&#xff0c;使开发者能够轻松构建全栈应用。传统的全栈开发通常需要单独搭建后端服务&#xf…

【6.1.2 漫画分布式事务技术选型】

漫画分布式事务技术选型 &#x1f3af; 学习目标&#xff1a;掌握架构师核心技能——分布式事务技术选型与一致性解决方案&#xff0c;构建高可靠的分布式系统 &#x1f3ad; 第一章&#xff1a;分布式事务模式对比 &#x1f914; 2PC vs 3PC vs TCC vs Saga 想象分布式事务就…

液冷智算数据中心崛起,AI算力联动PC Farm与云智算开拓新蓝海(二)

从算法革新到基础设施升级&#xff0c;从行业渗透到地域布局&#xff0c;人工智能算力正以 “规模扩张 效率提升”双轮驱动中国数字经济转型。中国智能算力规模将在 2025 年突破 1000 EFLOPS&#xff0c;2028 年达到 2781.9 EFLOPS&#xff0c;五年复合增长率 46.2%&#xff0…

《QtPy:Python与Qt的完美桥梁》

QtPy 是什么 在 Python 的广袤编程宇宙中&#xff0c;当涉及到图形用户界面&#xff08;GUI&#xff09;开发&#xff0c;Qt 框架宛如一颗璀璨的明星&#xff0c;散发着独特的魅力。而 QtPy&#xff0c;作为 Python 与 Qt 生态系统交互中的关键角色&#xff0c;更是为开发者们开…

ubuntu环境下调试 RT-Thread

调试 RT-Thread 下载源码 github 搜索 RT-Thread 下载源码 安装 python scons 环境 你已经安装了 kconfiglib&#xff0c;但 scons --menuconfig 仍然提示找不到它。这种情况通常是由于 Python 环境不一致 导致的&#xff1a;你在一个 Python 环境中安装了 kconfiglib&#xff…

【数据结构初阶】--顺序表(二)

&#x1f525;个人主页&#xff1a;草莓熊Lotso &#x1f3ac;作者简介&#xff1a;C研发方向学习者 &#x1f4d6;个人专栏&#xff1a; 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言&#xff1a;生活是默默的坚持&#xff0c;毅力是永久的…

Java中的方法传参机制

1. 概述Java中的方法传参机制分为两种&#xff1a;值传递&#xff08;Pass by Value&#xff09; 和 引用传递&#xff08;Pass by Reference&#xff09;。然而&#xff0c;Java中所有的参数传递都是值传递&#xff0c;只不过对于对象来说&#xff0c;传递的是对象的引用地址的…

C++——this关键字和new关键字

一、this 关键字1. 什么是 this&#xff1f;this 是 C 中的一个隐式指针&#xff0c;它指向当前对象&#xff08;即调用成员函数的对象&#xff09;&#xff0c;在成员函数内部使用&#xff0c;用于引用调用该函数的对象。每个类的非静态成员函数内部都可以使用 this。使用 thi…

Python中类静态方法:@classmethod/@staticmethod详解和实战示例

在 Python 中&#xff0c;类方法 (classmethod) 和静态方法 (staticmethod) 是类作用域下的两种特殊方法。它们使用装饰器定义&#xff0c;并且与实例方法 (def func(self)) 的行为有所不同。1. 三种方法的对比概览方法类型是否访问实例 (self)是否访问类 (cls)典型用途实例方法…

FastGPT革命:下一代语言模型的极速进化

本文深度解析FastGPT核心技术架构&#xff0c;涵盖分布式推理、量化压缩、硬件加速等前沿方案&#xff0c;包含完整落地实践指南&#xff0c;助你掌握大模型高效部署的终极武器。引言&#xff1a;当大模型遭遇速度瓶颈2023年&#xff0c;ChatGPT引爆全球AI热潮&#xff0c;但企…

Geant4 安装---Ubuntu

安装工具 C/C工具包 sudo apt install build-essentialCmake sudo apt install -y cmakeccmake sudo apt install -y cmake-curses-gui安装Qt可视化工具(不需要可视化可以不安装) sudo apt-get install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qtcreator 安装Ope…