讲师中心 微信公众号

工具推荐

视频效率加速
Seko
Seko

AI短剧一键生成成片

AniShort
AniShort

AI短剧协同制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

剧云
剧云

中文短剧剧本制作平台

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

浅丽大大_7570

浅丽大大_7570

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

|

358人浏览过

|

来源于php中文网

原创

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

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

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

为什么选 hiredis 而不是 redis-plus-plus 或 cpp_redis

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

常见错误现象:undefined reference to `redisConnect' —— 多半是链接时没加 -lhiredis,或者头文件路径没配对(#include <hiredis></hiredis> 对应的是安装后的 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++免费学习笔记(深入)”;

正确写法:

Ubuntu Hardening
Ubuntu Hardening

生成专业的 Linux 安全加固配置文件,支持 Ubuntu 系统及可自定义选项。

下载
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_STRING、REDIS_REPLY_INTEGER、REDIS_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); // 必须调用,否则内存泄漏
  • SET、DEL 等命令返回 REDIS_REPLY_STATUS,可用 reply->str 判断是否为 "OK"
  • LRANGE 返回 REDIS_REPLY_ARRAY,需遍历 reply->element[i]
  • 所有 redisReply* 必须用 freeReplyObject 释放,不能用 free() 或 delete

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

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

最小可行方案:

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

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

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

码上飞
码上飞 Hot

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

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

PixPix
PixPix Hot

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

豆包大模型

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

超级麦吉

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

DeepSeek

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

WorkBuddy

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

Laper
Laper Hot

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

相关专题

更多
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

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

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

5394

2025.06.09

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

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

5571

2025.07.04

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

399

2026.04.23

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

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

4818

2023.08.10

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

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

1349

2025.12.24

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

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

443

2026.01.21

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

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

0

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