使用 hiredis 同步连接 Redis 需调用 redisConnectWithTimeout 设置超时(单位为 struct timeval),连接后必须检查 context->err;执行命令需按 redisReply->type 分支安全处理并调用 freeReplyObject 释放;二进制数据须用 redisCommandArgv;context 非线程安全且无自动重连,需手动管理连接与 reply 生命周期。
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;
}
hiredis 的 redisCommand 返回的是 redisReply*,但它的结构不是扁平的,类型判断和字段访问必须严格按 reply->type 分支处理,否则容易段错误或读错内存。
REDIS_REPLY_STRING 才有 str 和 len;REDIS_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 != -1 和 c->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小时内与您取得联系。