0

0

C++如何连接Redis数据库_C++使用hiredis库读写缓存教程【后端】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-02-05 08:26:02

|

178人浏览过

|

来源于php中文网

原创

C++ 本身不内置 Redis 客户端,必须依赖第三方库;hiredis 是最轻量、最常用、官方推荐的 C/C++ 客户端,但仅支持同步阻塞模式,无异步和连接池功能。

c++如何连接redis数据库_c++使用hiredis库读写缓存教程【后端】

直接说结论:C++ 本身不内置 Redis 客户端,必须依赖第三方库;hiredis 是最轻量、最常用、也是官方推荐的 C/C++ 客户端,但它是同步阻塞的,不支持异步或连接池——这点很多人用了一两个月才发现卡在高并发场景。

为什么hiredis 而不是 redis-plus-pluscpp_redis

hiredis 是 Redis 官方维护的底层 C 库,稳定、无依赖、编译快;redis-plus-plus 功能强(支持异步、连接池、STL 容器自动序列化),但依赖 hiredis + openssl + g++17+,线上部署容易因 OpenSSL 版本不一致崩溃;cpp_redis 已停止维护。如果你只需要简单 SET/GEThiredis 足够且更可控。

常见错误现象:undefined reference to `redisConnect' —— 多半是链接时没加 -lhiredis,或者头文件路径没配对(#include 对应的是安装后的 include 路径,不是源码目录)。

  • Ubuntu/Debian 下装: sudo apt install libhiredis-dev(含头文件和静态/动态库)
  • macOS 用 Homebrew: brew install hiredis
  • 手动编译:从 GitHub clone 后 make && sudo make install,注意默认不安装头文件到 /usr/local/include,可能需要 sudo cp hiredis.h async.h read.h sds.h /usr/local/include/hiredis/

redisContext* 连接对象必须检查 c->err,不能只看指针是否为空

redisConnect 返回 NULL 确实代表失败,但更常见的是返回非空指针、而 c->err == 1(即出错但结构体已分配)。比如密码错误、Redis 拒绝连接、DNS 解析失败,都会进这个“假成功”分支。

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

正确写法:

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);
    }
    return -1;
}

漏掉 c->err 判断,后续调用 redisCommand 可能 segfault 或返回 NULL 却不报错,调试极其困难。

redisCommand 返回值类型多变,redisReply*type 字段决定怎么取值

redisCommand 总是返回 redisReply*,但它的 type 成员可能是 REDIS_REPLY_STRINGREDIS_REPLY_INTEGERREDIS_REPLY_ARRAY 等——不查 type 就直接访问 reply->str,遇到 INCR 返回整数时会 crash。

典型安全读取模式:

redisReply *reply = (redisReply*)redisCommand(c, "GET %s", "mykey");
if (!reply) {
    fprintf(stderr, "Redis command failed\n");
    redisFree(c);
    return -1;
}
if (reply->type == REDIS_REPLY_STRING) {
    printf("Value: %s\n", reply->str);
} else if (reply->type == REDIS_REPLY_NIL) {
    printf("Key not exists\n");
} else if (reply->type == REDIS_REPLY_INTEGER) {
    printf("Count: %lld\n", reply->integer);
} else {
    printf("Unexpected reply type: %d\n", reply->type);
}
freeReplyObject(reply); // 必须调用,否则内存泄漏
  • SETDEL 等命令返回 REDIS_REPLY_STATUS,可用 reply->str 判断是否为 "OK"
  • LRANGE 返回 REDIS_REPLY_ARRAY,需遍历 reply->element[i]
  • 所有 redisReply* 必须用 freeReplyObject 释放,不能用 free()delete

没有连接池、没有自动重连,得自己兜底

hiredis 不管理连接生命周期。网络闪断、Redis 重启后,旧 redisContext* 会处于不可用状态,但 c->err == 0redisCommand 可能返回 NULL 或阻塞超时。生产环境必须实现重连逻辑,且不能每次操作都新建连接(开销大)。

最小可行方案:

  • 封装一个连接句柄结构体,含 redisContext* 和最后成功时间
  • 每次操作前检查 c->err 或用 redisPing 探活(注意 redisPing 也返回 redisReply*,要判 type
  • 失败时 redisFree(c) + redisConnect 重建,最多重试 2–3 次
  • 避免全局单例 redisContext*,多线程必须每个线程独占连接(hiredis 非线程安全)

真正麻烦的不是连不上,而是连上了却发不出命令——比如 Redis 设置了 maxclients 上限,或客户端未及时 freeReplyObject 导致连接被服务端踢出,这种问题在线上压测时才暴露,日志里只看到大量 Connection refused,实际是连接被复用污染了。

热门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语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

238

2023.09.22

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

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

560

2024.03.01

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

282

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

193

2025.07.04

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

589

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

259

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

21

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

23

2026.01.21

抖音网页版入口与视频观看指南 抖音官网视频在线访问
抖音网页版入口与视频观看指南 抖音官网视频在线访问

本专题汇总了抖音网页版的入口链接、官方登录页面以及视频观看入口,帮助用户快速访问抖音网页版,提供免登录访问方式和直接进入视频播放页面的方法,确保顺利浏览和观看抖音视频。

61

2026.02.04

热门下载

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

精品课程

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

共6课时 | 0.4万人学习

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

共72课时 | 6.6万人学习

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

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