hiredis执行多个hincrby仅返回一个REDIS_REPLY_INTEGER结果咨询
关于hiredis管道中HINCRBY与HMGET返回结果差异的解析
核心原因拆解
这两种情况的差异,本质是Redis命令本身的返回结构 + hiredis管道的响应读取机制共同决定的:
多HINCRBY命令的管道处理逻辑
redisAppendCommand是将多个独立的HINCRBY命令加入请求队列,Redis会为每个HINCRBY返回单独的整数结果(对应该字段自增后的值)。redisGetReply的作用是逐个读取Redis返回的响应,每次调用只获取一个命令的结果,所以你看到的是单个REDIS_REPLY_INTEGER。如果要拿到所有结果,需要循环调用redisGetReply,次数和你append的命令数一致。
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_
相关产品推荐
相关产品推荐

