目录1.简介2.安装和配置2.1.源码编译安装通用方法2.2.包管理器安装特定系统[2.3.Windows 安装](#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它的核心特征有轻量级仅包含几个源文件和头文件无外部依赖易于集成。高性能基于非阻塞 I/O支持批量操作管道和异步回调。完整的 Redis 协议实现支持所有 Redis 命令和数据类型。线程安全通过连接池或每个线程独立连接实现线程安全。异步事件驱动可与 libevent、libev 等事件库集成适合高并发场景。2.安装和配置2.1.源码编译安装通用方法步骤 1获取源码cpp复制代码git clone https://github.com/redis/hiredis.git cd hiredis步骤 2编译与安装cpp复制代码make # 编译库 make test # 可选运行测试 sudo make install # 安装到系统目录默认/usr/local/lib 和 /usr/local/include步骤 3更新动态链接库缓存Linux 系统编程cpp复制代码sudo ldconfig2.2.包管理器安装特定系统1.Ubuntu/Debiancpp复制代码sudo apt-get install libhiredis-dev2.CentOS/RHELcpp复制代码sudo yum install hiredis-devel3.macOS (via Homebrew)cpp复制代码brew install hiredis2.3.Windows 安装方法 1使用 vcpkg推荐cpp复制代码git clone https://github.com/microsoft/vcpkg.git cd vcpkg .\bootstrap-vcpkg.bat .\vcpkg install hiredis方法 2手动编译MinGW/MSYS21.安装 MSYS2 并更新服务器运维cpp复制代码pacman -Syu2.安装编译工具链和依赖cpp复制代码pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake3.编译 hirediscpp复制代码git clone https://github.com/redis/hiredis.git cd hiredis make CCx86_64-w64-mingw32-gcc方法 3CMake编译参考Windows下通过CMake编译hiredis及应用_hiredis windows-CSDN博客3.常用的函数及功能Hiredis 提供了一系列用于与 Redis 服务器通信的函数主要分为连接管理、命令执行、异步操作和辅助工具四大类。以下是常用函数及其功能的详细介绍3.1.连接管理函数**redisConnect**创建同步连接到 Redis 服务器。操作系统cpp复制代码//函数声明 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**创建同步连接并设置超时时间。cpp复制代码redisContext *redisConnectWithTimeout(const char *ip, int port, struct timeval timeout);**redisFree**释放 Redis 连接上下文。cpp复制代码void redisFree(redisContext *c);3.2.命令执行函数**redisCommand**执行 Redis 命令并返回结果。cpp复制代码//函数声明 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 命令避免字符串格式化问题。人工智能开发cpp复制代码//函数声明 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**将命令添加到输出缓冲区用于管道。cpp复制代码int redisAppendCommand(redisContext *c, const char *format, ...);**redisGetReply**从输入缓冲区获取命令回复用于管道。cpp复制代码int redisGetReply(redisContext *c, void **reply);3.3.异步操作函数**redisAsyncConnect**创建异步连接到 Redis 服务器。cpp复制代码redisAsyncContext *redisAsyncConnect(const char *ip, int port);**redisAsyncSetConnectCallback**设置连接成功 / 失败的回调函数。cpp复制代码void redisAsyncSetConnectCallback(redisAsyncContext *ac, redisConnectCallback *fn);**redisAsyncCommand**异步执行 Redis 命令。AI系统开发cpp复制代码//函数声明 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**断开异步连接。cpp复制代码void redisAsyncDisconnect(redisAsyncContext *ac);3.4.回复处理函数**freeReplyObject**释放 Redis 回复对象防止内存泄漏。命令执行防护cpp复制代码void freeReplyObject(void *reply);3.5.错误处理**redisContext.err和redisContext.errstr**检查连接错误和错误信息。cpp复制代码if (ctx-err) { printf(Error: %s\n, ctx-errstr); }3.6.连接池与线程安全Hiredis 本身不是线程安全的但可通过以下方式实现线程安全1每个线程独立连接为每个线程创建单独的redisContext。2连接池管理多个redisContext实例线程需要时从池中获取。4.编译与链接编译时需链接 hiredis 库cpp复制代码gcc your_file.c -o your_program -lhiredis5.常见用法1.同步连接与命令执行cpp复制代码#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批量发送命令以减少网络往返cpp复制代码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.异步操作基于 libeventcpp复制代码#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()释放回复对象。AI系统开发2.线程安全redisContext非线程安全多线程环境需为每个线程创建独立连接或使用连接池。3.异步回调异步模式下回调函数会在事件循环线程中执行需注意线程安全。掌握hiredis的接口函数后你可以根据项目需求选择同步或异步方式与 Redis 服务器交互实现缓存、消息队列等功能。hiredis: 一个轻量级、高性能的 C 语言 Redis 客户端库 - 技术栈