1. Redis与C++的化学反应
第一次在C++项目里集成Redis时,那种数据存取速度的飞跃让我至今难忘。作为内存数据库的标杆,Redis的读写性能轻松突破10万QPS,而C++作为系统级语言的高效特性,二者结合能爆发出惊人的数据处理能力。不过在实际集成过程中,从客户端选型到连接池优化,每个环节都藏着不少门道。
主流C++连接Redis的方案主要有三种:官方推荐的hiredis、基于C++11封装的redis-plus-plus,以及跨平台的cpp_redis。我经手的电商系统中,库存服务和秒杀模块都重度依赖Redis,实测下来hiredis虽然接口原始但性能最好,redis-plus-plus则在易用性和现代C++特性支持上更胜一筹。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开发环境与工具链配置
2.1 基础环境搭建
在Ubuntu 20.04上配置开发环境时,这几个依赖缺一不可:
bash复制sudo apt-get install libhiredis-dev libssl-dev cmake g++
Windows平台推荐使用vcpkg管理依赖:
powershell复制vcpkg install hiredis:x64-windows
2.2 连接库选型对比
| 特性 | hiredis | redis-plus-plus | cpp_redis |
|---|---|---|---|
| 协议支持 | RESP2 | RESP2/3 | RESP2 |
| 连接池 | 需手动实现 | 内置 | 内置 |
| 线程安全 | 非线程安全 | 线程安全 | 线程安全 |
| 异步支持 | 需要回调函数 | Future/Promise | 回调函数 |
| 编译依赖 | 仅需C库 | C++11及以上 | C++11及以上 |
对于需要高并发的生产环境,我建议选择redis-plus-plus。它的连接池管理和异步接口用起来非常顺手,比如下面这个批量查询的示例:
cpp复制auto redis = Redis("tcp://127.0.0.1:6379");
std::vector<std::string> keys = {"item:1001", "user:2002"};
auto values = redis.mget(keys.begin(), keys.end());
3. hiredis核心操作实战
3.1 同步连接最佳实践
建立连接时这几个参数需要特别注意:
cpp复制redisContext* c = redisConnectWithTimeout("127.0.0.1", 6379, {.tv_sec=1, .tv_usec=0});
if (c == nullptr || c->err) {
if (c) {
std::cerr << "Connection error: " << c->errstr << std::endl;
redisFree(c);
} else {
std::cerr << "Allocation error" << std::endl;
}
return;
}
关键提示:hiredis默认不启用TCP Keepalive,长时间空闲的连接可能被服务器断开。建议设置SO_KEEPALIVE选项:
cpp复制int val = 1;
setsockopt(c->fd, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val));
3.2 命令执行与结果解析
处理返回结果时容易踩的坑是忘记释放reply对象:
cpp复制redisReply* reply = (redisReply*)redisCommand(c, "GET %s", key);
if (reply == nullptr) {
std::cerr << "Command failed: " << c->errstr << std::endl;
redisFree(c);
return;
}
if (reply->type == REDIS_REPLY_STRING) {
std::string value(reply->str, reply->len);
std::cout << "Got value: " << value << std::endl;
} else if (reply->type == REDIS_REPLY_NIL) {
std::cout <<
