news 2026/7/1 23:32:47

C++ 中解锁 Redis

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 中解锁 Redis

一、核心前提:选择 Redis C++ 客户端库

C++ 本身没有内置 Redis 客户端,主流选择是hiredis(官方推荐的 C 语言客户端,轻量、稳定,C++ 可直接调用),也是最基础、最常用的库。

1. 环境安装(以 Linux 为例)

bash

运行

# 1. 安装hiredis库 sudo apt update sudo apt install libhiredis-dev # 2. 验证安装(查看库文件) ls /usr/lib/x86_64-linux-gnu/libhiredis*

注:Windows 环境可下载 hiredis 源码编译,或使用 vcpkg 安装:vcpkg install hiredis

2. 编译指令

编写 C++ 代码后,编译时需链接 hiredis 库:

bash

运行

g++ your_code.cpp -o redis_demo -lhiredis

二、C++ 操作 Redis 核心实战代码

以下是完整的 C++ 操作 Redis 示例,包含连接、字符串操作、哈希操作、列表操作、断开连接等核心场景:

cpp

运行

#include <iostream> #include <string> #include <hiredis/hiredis.h> using namespace std; // 封装Redis连接函数 redisContext* connectRedis(const string& ip, int port, const string& password = "") { // 1. 建立连接(超时时间10秒) struct timeval timeout = {10, 0}; redisContext* ctx = redisConnectWithTimeout(ip.c_str(), port, timeout); // 2. 检查连接错误 if (ctx == nullptr || ctx->err) { if (ctx) { cerr << "连接Redis失败:" << ctx->errstr << endl; redisFree(ctx); } else { cerr << "Redis连接对象创建失败!" << endl; } return nullptr; } cout << "Redis连接成功!" << endl; // 3. 有密码则认证 if (!password.empty()) { redisReply* reply = (redisReply*)redisCommand(ctx, "AUTH %s", password.c_str()); if (reply == nullptr || reply->type == REDIS_REPLY_ERROR) { cerr << "Redis认证失败:" << (reply ? reply->str : "无返回") << endl; freeReplyObject(reply); redisFree(ctx); return nullptr; } freeReplyObject(reply); cout << "Redis认证成功!" << endl; } return ctx; } // 封装Redis命令执行函数 redisReply* executeRedisCommand(redisContext* ctx, const char* format, ...) { if (ctx == nullptr) { cerr << "Redis连接为空,无法执行命令!" << endl; return nullptr; } va_list args; va_start(args, format); redisReply* reply = (redisReply*)redisvCommand(ctx, format, args); va_end(args); // 检查命令执行错误 if (reply == nullptr) { cerr << "命令执行失败:连接已断开" << endl; return nullptr; } if (reply->type == REDIS_REPLY_ERROR) { cerr << "Redis命令错误:" << reply->str << endl; } return reply; } int main() { // 1. 连接Redis(替换为你的Redis地址、端口、密码) string redis_ip = "127.0.0.1"; int redis_port = 6379; string redis_pwd = ""; // 无密码则留空 redisContext* ctx = connectRedis(redis_ip, redis_port, redis_pwd); if (ctx == nullptr) { return -1; } // 2. 核心操作1:字符串(String)- SET/GET cout << "\n===== 字符串操作 =====" << endl; redisReply* reply = executeRedisCommand(ctx, "SET user:name Tom"); if (reply && reply->type == REDIS_REPLY_STATUS && strcmp(reply->str, "OK") == 0) { cout << "SET成功" << endl; } freeReplyObject(reply); reply = executeRedisCommand(ctx, "GET user:name"); if (reply && reply->type == REDIS_REPLY_STRING) { cout << "GET user:name = " << reply->str << endl; } freeReplyObject(reply); // 3. 核心操作2:哈希(Hash)- HSET/HGETALL cout << "\n===== 哈希操作 =====" << endl; reply = executeRedisCommand(ctx, "HSET user:1 name Jerry age 20 gender male"); if (reply && reply->type == REDIS_REPLY_INTEGER) { cout << "HSET成功,新增字段数:" << reply->integer << endl; } freeReplyObject(reply); reply = executeRedisCommand(ctx, "HGETALL user:1"); if (reply && reply->type == REDIS_REPLY_ARRAY) { cout << "HGETALL user:1 = "; for (size_t i = 0; i < reply->elements; i += 2) { cout << reply->element[i]->str << ":" << reply->element[i+1]->str << " "; } cout << endl; } freeReplyObject(reply); // 4. 核心操作3:列表(List)- LPUSH/LRANGE cout << "\n===== 列表操作 =====" << endl; reply = executeRedisCommand(ctx, "LPUSH fruits apple banana orange"); if (reply && reply->type == REDIS_REPLY_INTEGER) { cout << "LPUSH成功,列表长度:" << reply->integer << endl; } freeReplyObject(reply); reply = executeRedisCommand(ctx, "LRANGE fruits 0 -1"); if (reply && reply->type == REDIS_REPLY_ARRAY) { cout << "LRANGE fruits = "; for (size_t i = 0; i < reply->elements; i++) { cout << reply->element[i]->str << " "; } cout << endl; } freeReplyObject(reply); // 5. 断开连接 redisFree(ctx); cout << "\nRedis连接已断开" << endl; return 0; }

三、核心代码解释

  1. 连接 Redis
    • redisConnectWithTimeout:带超时的连接函数,避免无限等待;
    • AUTH命令:Redis 有密码时必须执行认证,否则后续命令会报错。
  2. 命令执行
    • redisCommand/redisvCommand:执行 Redis 命令,支持格式化参数(类似printf);
    • redisReply:存储命令返回结果,需通过type判断返回类型(字符串、数组、整数、状态等)。
  3. 资源释放
    • freeReplyObject:必须释放每个redisReply,避免内存泄漏;
    • redisFree:断开连接时释放上下文对象。

四、常见问题与注意事项

  1. 返回值类型对应

    Redis 命令返回类型redisReply->type示例
    成功状态(OK)REDIS_REPLY_STATUSSET、DEL 命令
    字符串 / 数字REDIS_REPLY_STRINGGET、HGET 命令
    整数REDIS_REPLY_INTEGERLPUSH、LLEN 命令
    数组REDIS_REPLY_ARRAYHGETALL、LRANGE 命令
    错误REDIS_REPLY_ERROR语法错误、认证失败
  2. 异常处理

    • 连接断开后,redisContext->err会被置位,需重新连接;
    • 生产环境建议封装重连逻辑,避免单次连接失败导致程序退出。
  3. 进阶选择:若嫌 hiredis(C 风格)不够 “C++ 化”,可选择封装后的 C++ 库:

    • redis-plus-plus:基于 hiredis 的现代 C++ 封装,支持 RAII、异步操作;
    • cpp_redis:轻量级异步 Redis 客户端,支持发布订阅、集群。

总结

  1. C++ 操作 Redis 的核心是使用hiredis 库,编译时需链接-lhiredis
  2. 核心流程:建立连接 → 执行命令(处理返回值) → 释放资源 → 断开连接;
  3. 需重点关注redisReply的类型判断和资源释放,避免内存泄漏和逻辑错误。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/29 18:33:30

【好写作AI】别慌!“AI痕迹”检测,到底在检测什么?

好写作AI官方网址&#xff1a;https://www.haoxiezuo.cn/一、新的焦虑正在蔓延&#xff1a;你的论文&#xff0c;有“AI味”吗&#xff1f; 提交论文前&#xff0c;除了查重&#xff0c;你是不是开始多了一个动作——把文段丢进各种“AI检测器”&#xff0c;紧张地等待结果&…

作者头像 李华
网站建设 2026/6/26 10:58:26

制造工厂研发人员需要实现5个SolidWorks共享一台服务器如何实现

在制造工厂中&#xff0c;当5名SolidWorks研发人员需要共享一台服务器时&#xff0c;合理的配置和优化能够显著提升协作效率和数据安全性。此方案核心在于集中化资源管理、动态化资源分配、智能化权限管控&#xff0c;结合高性能硬件配置与协同设计功能&#xff0c;可显著提升资…

作者头像 李华
网站建设 2026/6/28 23:37:03

数据不会说话?虎贲等考 AI 数据分析:让论文实证硬核到惊艳导师

还在对着一堆问卷数据、实验结果抓耳挠腮&#xff1f;用 SPSS 半天跑不出一个相关性分析&#xff0c;用 Excel 画的图表被批 “小学生水平”&#xff1f;辛苦收集的数据&#xff0c;最后只能用干巴巴的文字描述&#xff0c;论文实证部分毫无说服力&#xff1f; 在论文写作的实…

作者头像 李华
网站建设 2026/6/30 1:05:01

打破“数据孤岛”,实现全厂设备一站式可视化管理

核心痛点&#xff1a;在传统的制造工厂中&#xff0c;不同品牌、不同型号的PLC&#xff08;西门子、三菱、欧姆龙等&#xff09;控制着生产线上的各类设备。这些设备数据相互隔绝&#xff0c;形成一个个“数据孤岛”。管理者无法实时掌握设备运行状态、工艺参数、故障信息&…

作者头像 李华
网站建设 2026/6/28 21:41:07

Python+Vue的线上社区信息发布管理平台设计 Pycharm django flask

收藏关注不迷路&#xff01;&#xff01;需要的小伙伴可以发链接或者截图给我 项目介绍 随着互联网技术的不断发展&#xff0c;线上社区已经成为了人们日常生活中不可或缺的一部分。在这样的背景下&#xff0c;为了更好地服务社区用户&#xff0c;提高信息传递的效率和准确性&a…

作者头像 李华