C++怎么调用Redis_C++缓存操作教程【后端】

1次阅读

生产环境应选用 redis-plus-plus。它基于 hiredis,提供 c++17 接口,支持连接池、异步和事务,需正确配置 hiredis 依赖、头文件路径及超时参数,注意字符串处理、optional 解包和 pipeline 使用规范。

C++怎么调用Redis_C++缓存操作教程【后端】

Redis C++ 客户端选哪个才不踩坑

别用 redis-cplusplus(已十年未更新)、也别自己封装 hiredis C 接口——生产环境直接上 redis-plus-plus。它基于 hiredis,但提供了现代 C++17 接口,支持连接池、异步、事务,且文档虽简但示例可直接跑通。

  • 编译依赖必须装 hiredis 1.0.0+(ubuntu/debian:`sudo apt install libhiredis-dev`;macos:`brew install hiredis`)
  • CMake 中要显式 find_package(hiredis),否则链接会报 undefined reference to redisConnect
  • 头文件路径不是 #include "redis++.h",而是 #include "sw/redis++/redis++.h"(注意命名空间路径)

连接 Redis 失败时先查这三件事

连不上不是代码写错了,大概率是配置或网络链路问题。错误常表现为 ConnectionError 或程序卡在 Redis::Redis(const ConnectionOptions&) 构造里。

  • 检查 ConnectionOptions.host 是否写成了 "localhost" —— docker 容器内要用宿主 IP(如 "172.17.0.1")或 "host.docker.internal"
  • ConnectionOptions.port 默认是 6379,但某些云 Redis 实例强制走 TLS,得设 ConnectionOptions.ssl = true 并配证书路径
  • 超时参数不设会无限阻塞:ConnectionOptions.connect_timeout = std::chrono::milliseconds(1000)socket_timeout 都得显式指定

set/get 字符串时 String 和 const char* 别混用

redis.set("key", "value") 看似简单,但传 std::string 和裸指针行为不同:前者自动处理长度,后者若没带 len 参数,会调 strlen——遇到含 <p><code>redis.set("key", "value") 看似简单,但传 std::string 和裸指针行为不同:前者自动处理长度,后者若没带 len 参数,会调 strlen——遇到含 的二进制数据就截断。

的二进制数据就截断。

  • 安全写法统一用 std::stringredis.set("user:1001", std::string(buf, len))
  • 如果必须用 const char*,务必加长度:redis.set("data", ptr, len)
  • 读取时 redis.get("key") 返回 Optional<:string></:string>,不是 std::string,空值时解包前要判 if (val),否则 *val 段错误

批量操作用 pipeline 而不是 for 循环

10 次独立 set 在局域网延迟约 10×0.2ms = 2ms,用 pipeline 可压到 0.3ms 左右。但别以为加个 pipeline 就万事大吉——它不自动事务,也不保证原子性。

立即学习C++免费学习笔记(深入)”;

  • 创建 pipeline:auto pipe = redis.pipeline(),之后所有命令发给 pipe,不是 redis
  • 执行必须调 pipe.exec(),否则命令根本不发出去;返回值是 std::vector<optional>></optional>,顺序与调用一致
  • pipeline 不支持 WATCH/MULTI/EXEC,要事务得用 redis.transaction() 单独开一个上下文

Redis 是快,但 C++ 客户端的坑往往不在协议层,而在连接生命周期管理、字符串边界和异步回调的线程安全上。尤其当服务启停频繁时,Redis 对象析构顺序、连接池复用逻辑、以及 std::optional 解包时机,这几个点最容易漏查。

text=ZqhQzanResources