You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

hiredis执行多个hincrby仅返回一个REDIS_REPLY_INTEGER结果咨询

关于hiredis管道中HINCRBY与HMGET返回结果差异的解析

核心原因拆解

这两种情况的差异,本质是Redis命令本身的返回结构 + hiredis管道的响应读取机制共同决定的:

  1. 多HINCRBY命令的管道处理逻辑

    • redisAppendCommand是将多个独立的HINCRBY命令加入请求队列,Redis会为每个HINCRBY返回单独的整数结果(对应该字段自增后的值)。
    • redisGetReply的作用是逐个读取Redis返回的响应,每次调用只获取一个命令的结果,所以你看到的是单个REDIS_REPLY_INTEGER。如果要拿到所有结果,需要循环调用redisGetReply,次数和你append的命令数一致。
  2. HMGET命令的返回特性

    • HMGET本身是一个独立命令,它的设计就是返回一个数组(对应每个查询字段的取值),所以无论你查询多少个字段,Redis只会返回一个REDIS_REPLY_ARRAY类型的响应,redisGetReply一次就能获取完整结果。

代码示例验证

多HINCRBY的正确读取方式

// 假设已初始化redisContext *c连接
redisAppendCommand(c, "HINCRBY", "user_scores", "alice", "5", NULL);
redisAppendCommand(c, "HINCRBY", "user_scores", "bob", "3", NULL);
redisAppendCommand(c, "HINCRBY", "user_scores", "charlie", "1", NULL);

redisReply *reply;
// 循环读取3个命令的响应
for (int i = 0; i < 3; i++) {
    if (redisGetReply(c, &reply) == REDIS_OK) {
        if (reply->type == REDIS_REPLY_INTEGER) {
            printf("HINCRBY 结果: %lld\n", reply->integer);
        }
        freeReplyObject(reply);
    }
}

HMGET的读取方式

redisAppendCommand(c, "HMGET", "user_scores", "alice", "bob", "charlie", NULL);

redisReply *reply;
if (redisGetReply(c, &reply) == REDIS_OK) {
    if (reply->type == REDIS_REPLY_ARRAY) {
        for (size_t j = 0; j < reply->elements; j++) {
            printf("HMGET 第%zu个结果: %s\n", j+1, reply->element[j]->str);
        }
    }
    freeReplyObject(reply);
}

总结

  • 管道中每个redisAppendCommand添加的都是独立请求,Redis会返回等量的独立响应,需逐个读取。
  • 单个命令的返回结构由Redis命令本身定义,HMGET天然返回数组,因此对应单个数组类型的响应。

内容的提问来源于stack exchange,提问作者Stream_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 03:30:56