0

0

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

穿越時空

穿越時空

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

|

998人浏览过

|

来源于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 后取不到返回值,replyNULL 或类型不对

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

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

为什么 redisAppendCommand + redisGetReplyredisCommand 更难写对?

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

Sora
Sora

Sora是OpenAI发布的一种文生视频AI大模型,可以根据文本指令创建现实和富有想象力的场景。

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

编译链接 hiredis 时提示 undefined reference 到 redisConnectredisFree

不是头文件没包含,是链接阶段漏了库。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工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

248

2023.09.22

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

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

927

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

835

2023.08.22

printf用法大全
printf用法大全

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

76

2023.06.20

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

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

300

2023.11.28

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

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

638

2023.08.03

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

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

218

2023.09.04

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

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

1560

2023.10.24

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

0

2026.02.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.4万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 6.9万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号