hiredis是Redis官方推荐的轻量C客户端,C++可直接调用;它无依赖、稳定可控,适合简单SET/GET场景,但需注意链接库、检查c->err、释放reply、设超时及避免多线程共享context。

用 hiredis 连 Redis 是最直接的选择
标准 C++ 没有内置 Redis 客户端,hiredis 是官方推荐的 C 语言客户端,C++ 可直接调用。它轻量、稳定、无依赖,比 Boost.Asio + 手写协议或第三方 C++ 封装(如 redis-plus-plus)更可控,尤其适合简单 SET/GET 场景。
常见错误是直接 `#include
- 安装时启用 CMake 的
ENABLE_SSL=OFF(除非真要 TLS,否则默认编译会失败) - 编译时加
-lhiredis,不是-lredis或-lhiredis.a - 头文件包含用
#include <hiredis></hiredis>,不是#include "redis.h"
redisConnect 失败后必须检查 c->err,不能只看返回值是否为 NULL
很多新手以为 redisConnect 返回 NULL 就代表连不上,其实它也可能返回非空指针但内部出错(比如 DNS 解析失败后重试中)。真正判断依据是 c->err 是否非零:
redisContext *c = redisConnect("127.0.0.1", 6379);
if (c == NULL || c->err) {
if (c) {
fprintf(stderr, "Connection error: %s\n", c->errstr);
redisFree(c);
} else {
fprintf(stderr, "Connection allocation failed\n");
}
return -1;
}
注意:c->errstr 是可读字符串,c->err 是整数错误码(0 表示成功),两者都要查。
立即学习“C++免费学习笔记(深入)”;
执行 redisCommand 后必须用 freeReplyObject 释放 reply,否则内存泄漏
redisCommand 返回的是 redisReply*,无论命令成功与否,只要返回了指针,就必须调用 freeReplyObject。漏掉这步在循环发请求时会快速耗尽内存。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
SET 和 GET 的典型写法:
// SET
redisReply *r = (redisReply*)redisCommand(c, "SET %s %s", "mykey", "hello");
if (r && r->type == REDIS_REPLY_STATUS && strcmp(r->str, "OK") == 0) {
printf("SET success\n");
}
freeReplyObject(r); // 必须!哪怕 r 是 NULL 也安全
// GET
r = (redisReply*)redisCommand(c, "GET %s", "mykey");
if (r && r->type == REDIS_REPLY_STRING) {
printf("GET value: %s\n", r->str);
}
freeReplyObject(r);
关键点:
-
r->type必须校验:SET 返回REDIS_REPLY_STATUS,GET 成功返回REDIS_REPLY_STRING,失败返回REDIS_REPLY_NIL - 不要假设
r->str总是非空——REDIS_REPLY_NIL时r->str == NULL,直接printf("%s")会崩溃 -
redisCommand不支持二进制安全 key/value(含 \0),如需存 raw bytes,改用redisCommandArgv
连接池和超时设置容易被忽略,单次操作不显问题,高并发下会卡死
默认 redisConnect 是阻塞式且无超时,如果 Redis 服务宕机或网络中断,redisConnect 可能卡住几十秒。生产环境必须设超时:
struct timeval timeout = { 1, 500000 }; // 1.5 秒
redisContext *c = redisConnectWithTimeout("127.0.0.1", 6379, timeout);
另外,频繁新建/销毁连接开销大。若需多次操作,复用同一个 redisContext* 即可,但要注意:hiredis 不是线程安全的——多个线程不能共用一个 c,必须每个线程独占或加锁。
最后提醒:Redis 命令参数都是字符串,SET key value 中的 value 不能带空格或特殊字符(除非用 redisCommandArgv 手动构造 argv),否则命令解析失败返回 REDIS_REPLY_ERROR。

















