全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++怎么操作redis数据库_c++ hiredis库连接与命令执行【实战】

使用 hiredis 同步连接 Redis 需调用 redisConnectWithTimeout 设置超时(单位为 struct timeval),连接后必须检查 context->err;执行命令需按 redisReply->type 分支安全处理并调用 freeReplyObject 释放;二进制数据须用 redisCommandArgv;context 非线程安全且无自动重连,需手动管理连接与 reply 生命周期。

怎么用 hiredis 连 Redis 服务(同步模式)

hiredis 默认是同步阻塞的,连接失败或网络卡住会直接 hang 住线程。所以第一步必须设好超时,否则生产环境容易出问题。

  • redisConnect 不支持超时,得用 redisConnectWithTimeout
  • 超时单位是 struct timeval,不是毫秒——{1, 500000} 表示 1.5 秒
  • 连接后务必检查 context->err,不能只看指针是否为空(比如认证失败时指针非空但 err 非零)
struct timeval timeout = {1, 500000};
redisContext *c = redisConnectWithTimeout("127.0.0.1", 6379, timeout);
if (c == nullptr || c->err) {
    if (c) {
        fprintf(stderr, "Redis connection error: %s\n", c->errstr);
        redisFree(c);
    }
    return -1;
}

怎么执行 SET/GET 命令并安全取返回值

hiredis 的 redisCommand 返回的是 redisReply*,但它的结构不是扁平的,类型判断和字段访问必须严格按 reply->type 分支处理,否则容易段错误或读错内存。

  • REDIS_REPLY_STRING 才有 strlenREDIS_REPLY_INTEGER 要用 integer 字段
  • REDIS_REPLY_NIL 表示 key 不存在,此时 str == nullptr,不能直接 strlen
  • 所有 redisReply* 必须用 freeReplyObject 释放,不释放会内存泄漏
redisReply *reply = (redisReply*)redisCommand(c, "SET mykey 'hello'");
if (reply && reply->type == REDIS_REPLY_STATUS && strcmp(reply->str, "OK") == 0) {
    printf("SET success\n");
}
freeReplyObject(reply);

reply = (redisReply*)redisCommand(c, "GET mykey");
if (reply) {
    if (reply->type == REDIS_REPLY_STRING) {
        printf("GET result: %.*s\n", (int)reply->len, reply->str);
    } else if (reply->type == REDIS_REPLY_NIL) {
        printf("key not exists\n");
    }
}
freeReplyObject(reply);

怎么处理批量命令和二进制安全数据

Redis 原生支持二进制 key/value,但 C 字符串习惯用

Redis 原生支持二进制 key/value,但 C 字符串习惯用 \0 截断,直接传 char* 会丢数据。hiredis 提供了带长度参数的接口,必须用它们。

截断,直接传 char* 会丢数据。hiredis 提供了带长度参数的接口,必须用它们。

  • 避免用 redisCommand(c, "SET %b %b", key, key_len, val, val_len) 这种格式化方式——它内部仍走 sprintf,对二进制不安全
  • 改用 redisCommandArgv,手动构造 redisArgv 数组,每个元素带 len
  • 批量操作别硬写多个 redisCommand,用 pipeline(即连续发命令+一次收回复)提升吞吐
const char *argv[4];
size_t argvlen[4];
argv[0] = "MSET"; argvlen[0] = 4;
argv[1] = "key1"; argvlen[1] = 4;
argv[2] = "val1"; argvlen[2] = 4;
argv[3] = "key2"; argvlen[3] = 4;
// 注意:MSET 后面要成对出现,这里只是示意结构
redisReply *r = (redisReply*)redisCommandArgv(c, 4, argv, argvlen);

为什么程序跑一会儿就卡死或崩溃

最常见的三个原因:连接未重连、reply 未释放、多线程共用 context。hiredis 的 redisContext 不是线程安全的,且没有自动重连机制。

  • 每次发命令前,检查 c->fd != -1c->err == 0,任一不成立就得 redisFree + 重连
  • 所有 redisCommand 调用后,无论成功失败,都必须 freeReplyObject(包括返回 nullptr 的情况)
  • 多线程场景下,每个线程必须有自己的 redisContext,或者用连接池管理(不能简单全局单例)

连接断开后 redisCommand 可能返回 nullptr,但 context 还活着,继续用会导致未定义行为——这个点最容易被忽略。


# redis  # c++  # 为什么  # red  # Integer  # strlen  # 字符串  # char  # 指针  # 接口  # Struct  # 线程  # 多线程  # len  # 数据库  # 用它  # 自己的  # 的是  # 多个  # 才有  # 要用  # 不存在  # 不支持  # 就得 


相关文章: 如何确认建站备案号应放置的具体位置?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  电商网站制作公司有哪些,1688网是什么意思?  如何通过虚拟机搭建网站?详细步骤解析  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  微信小程序 input输入框控件详解及实例(多种示例)  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  如何用PHP快速搭建CMS系统?  临沂网站制作企业,临沂第三中学官方网站?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  实现虚拟支付需哪些建站技术支撑?  如何在建站主机中优化服务器配置?  如何用美橙互联一键搭建多站合一网站?  建站之星安装后如何自定义网站颜色与字体?  c# 在高并发下使用反射发射(Reflection.Emit)的性能  ,有什么在线背英语单词效率比较高的网站?  如何在万网主机上快速搭建网站?  如何在阿里云购买域名并搭建网站?  Bpmn 2.0的XML文件怎么画流程图  c# Task.ConfigureAwait(true) 在什么场景下是必须的  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  如何自定义建站之星网站的导航菜单样式?  网站制作话术技巧,网站推广做的好怎么话术?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  如何快速配置高效服务器建站软件?  长沙企业网站制作哪家好,长沙水业集团官方网站?  如何有效防御Web建站篡改攻击?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  如何在IIS管理器中快速创建并配置网站?  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?  在线制作视频网站免费,都有哪些好的动漫网站?  昆明网站制作哪家好,昆明公租房申请网上登录入口?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  家庭建站与云服务器建站,如何选择更优?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  做企业网站制作流程,企业网站制作基本流程有哪些?  如何选择服务器才能高效搭建专属网站?  如何规划企业建站流程的关键步骤?  ,怎么在广州志愿者网站注册?  建站之星展会模板:智能建站与自助搭建高效解决方案  制作网站怎么制作,*游戏网站怎么搭建?  建站之星代理如何优化在线客服效率?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  早安海报制作网站推荐大全,企业早安海报怎么每天更换?  网站微信制作软件,如何制作微信链接?  如何实现建站之星域名转发设置? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。