讲师中心 微信公众号

工具推荐

视频效率加速
updream

一键生成高质量推广成片

Seko
Seko

AI短剧一键生成成片

Laper
Laper

剧本策划到成片协作

剧云
剧云

中文短剧剧本制作平台

C++如何调用Redis数据库?(hiredis客户端示例)

酷晨小哥_1875

酷晨小哥_1875

发布时间:2026-02-28 16:02:02

|

1038人浏览过

|

来源于php中文网

原创

hiredis连接Redis失败时,先确认redis-server运行及监听地址端口匹配,用redis-cli测试连通性;注意IPv6需特殊配置;连接后必查context->err;操作reply前须校验type并及时释放;异步模式需严格控制调用顺序;链接错误需检查pkg-config输出并确保库链接顺序正确。

c++如何调用redis数据库?(hiredis客户端示例)

hiredis 连接 Redis 失败,redisConnect 返回 NULL 怎么查?

绝大多数连接失败不是代码写错了,而是网络或服务没起来。先确认 redis-server 确实在跑,且监听地址和端口跟代码里传给 redisConnect 的一致。

  • 用 redis-cli -h 127.0.0.1 -p 6379 ping 手动测试连通性;如果失败,redisConnect 必然返回 NULL
  • redisConnect 默认只支持 IPv4,若 Redis 绑定在 ::1(IPv6),得显式用 redisConnectWithTimeout + struct sockaddr_in6,但更简单的是改 Redis 配置:把 bind 127.0.0.1 加上,或删掉 bind 行让其监听所有接口
  • 连接后务必检查 context->err:即使 redisConnect 不返回 NULL,也可能因认证失败、OOM 等原因处于错误状态,此时 context->err 非零,context->errstr 有具体提示

执行 redisCommand 后取不到返回值,reply 是 NULL 或类型不对

hiredis 的 redisReply 结构体必须按类型安全访问,直接读 reply->str 而不检查 reply->type 是最常见崩溃源。

  • 命令出错时(比如语法错、key 不存在),Redis 仍会返回 REDIS_REPLY_ERROR 类型的 reply,reply->str 指向错误信息,不是空指针——但你不能当成字符串直接用 strlen 或 printf,得先判 reply->type == REDIS_REPLY_ERROR
  • GET 返回 REDIS_REPLY_STRING,LRANGE 返回 REDIS_REPLY_ARRAY,EXISTS 返回 REDIS_REPLY_INTEGER;类型错配会导致段错误或乱码
  • 别忘了 freeReplyObject(reply):每次 redisCommand 分配的 redisReply* 都要手动释放,否则内存泄漏;但 redisCommand 内部失败时可能根本没分配 reply,所以释放前加 if (reply) freeReplyObject(reply);

为什么 redisAppendCommand + redisGetReply 比 redisCommand 更难写对?

这是 hiredis 的异步模式,适合高吞吐场景,但要求严格控制调用顺序和上下文生命周期,新手容易在连接断开或超时时卡死。

Sentinal Redis
Sentinal Redis

监控Redis服务器健康状况、内存、性能及BullMQ队列。检查队列深度、失败任务,分析慢查询并诊断问题。

下载
  • redisAppendCommand 只把命令写入输出缓冲区,不发包;必须紧接着调用 redisGetReply 才真正收响应——中间如果混入其他 I/O 或线程切换,可能拿到上一条命令的 reply
  • redisGetReply 是阻塞的,如果 Redis 没响应(比如网络中断、服务宕机),它会一直等,除非提前设置 context->timeout(通过 redisSetTimeout)
  • 异步模式下,redisFree 会自动 flush 缓冲区并关闭 socket,但如果还有未 redisGetReply 的 pending 命令,这些 reply 就永远拿不到了,变成资源泄露

编译链接 hiredis 时提示 undefined reference 到 redisConnect 或 redisFree

不是头文件没包含,是链接阶段漏了库。hiredis 是纯 C 库,没有 C++ name mangling 问题,但链接器找不到符号说明没连上 libhiredis。

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

  • 确保 pkg-config 可用:pkg-config --libs hiredis 应输出类似 -lhiredis;g++ 命令末尾加上这个输出结果
  • 静态链接时注意顺序:目标文件必须在 -lhiredis 之前,比如 g++ main.cpp -lhiredis 正确,g++ -lhiredis main.cpp 会失败
  • macOS 上用 Homebrew 安装的 hiredis,默认头文件在 /opt/homebrew/include,库在 /opt/homebrew/lib,需显式加 -I/opt/homebrew/include -L/opt/homebrew/lib

hiredis 本身不处理连接池、重试、密码加密这些事,所有异常路径都得自己兜底。最常被忽略的是:Redis 断连后 context 不会自动重连,redisCommand 直接返回 NULL,而很多人只检查 reply 是否为空,却忘了再查 context->err 是否为 REDIS_ERR_IO。

热门AI工具

更多
超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

569

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

948

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1029

2023.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1918

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

3184

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6384

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

6529

2023.11.24

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go-Zero官方文档
Go-Zero官方文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn