hiredis是C++连接Redis的事实标准客户端,轻量稳定无依赖;需用redisConnectWithTimeout设超时、及时AUTH/SELECT、每线程独占context、检查reply->type并freeReplyObject释放内存。

用 hiredis 连 Redis 是最直接的选择
官方 C 客户端 hiredis 是 C++ 项目连 Redis 的事实标准,轻量、稳定、无依赖。C++ 标准库不内置 Redis 支持,别指望用 std::redis 或类似名字的类——根本不存在。
实操建议:
- Linux/macOS 下用包管理器装:
apt install libhiredis-dev(Ubuntu)或brew install hiredis(macOS) - Windows 下推荐用 vcpkg:
vcpkg install hiredis:x64-windows,然后在 CMakeLists.txt 里 linkhiredis - 头文件只用
#include <hiredis></hiredis>,别引入 C++ 封装层(如redis-plus-plus),除非你明确需要异步或连接池
redisConnect 失败时先检查这三件事
连不上不是代码写错了,大概率是环境或参数问题。常见错误信息 (nil) 返回值或 redisContext* ctx == nullptr 就表示连接失败。
排查顺序:
- 确认 Redis 服务在运行:
redis-cli ping能返回PONG再继续 - 检查地址和端口:默认是
"127.0.0.1"和6379,但代码里写成"localhost"在某些系统(尤其启用了 IPv6 的)可能解析出错,坚持用"127.0.0.1" - 防火墙/SELinux 干扰:Docker 容器内连宿主 Redis 时,别用
127.0.0.1,改用宿主真实 IP 或host.docker.internal(仅 Docker Desktop)
执行命令必须检查 redisReply 的 type 字段
redisCommand 返回的是 redisReply*,它不是字符串指针,也不是自动转义的值。直接访问 reply->str 前不判断 reply->type,十有八九崩溃或读到乱码。
典型安全用法:
redisReply *reply = (redisReply*)redisCommand(ctx, "GET %s", key);
if (!reply) {
// 连接已断,ctx 不可用,别再调用 redisFree
return;
}
if (reply->type == REDIS_REPLY_STRING) {
printf("value: %s\n", reply->str);
} else if (reply->type == REDIS_REPLY_NIL) {
printf("key not exists\n");
} else if (reply->type == REDIS_REPLY_ERROR) {
printf("redis error: %s\n", reply->str);
}
freeReplyObject(reply); // 必须手动释放,不释放会内存泄漏
别在多线程里共用一个 redisContext
hiredis 的 redisContext 不是线程安全的。多个线程同时调用 redisCommand 会踩内存、丢命令、甚至导致程序卡死。
正确做法:
- 每个线程自己调用
redisConnect创建独立redisContext,用完redisFree - 如果要复用连接,必须加互斥锁(比如
std::mutex)包裹整个redisCommand+freeReplyObject流程 - 高并发场景下,考虑用连接池(自己封装或上
redis-plus-plus),但注意它的连接池默认也不跨线程共享 context
很多人卡在“为什么单线程能跑,一开多线程就 segfault”,根源几乎都在这里。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











