使用hiredis执行script load命令时参数错误,Redis客户端执行正常求助
问题排查:hiredis执行
script load时报参数数量错误 我来帮你搞定这个问题——你遇到的参数数量错误,其实是对hiredis的redisCommand函数的用法理解出了偏差。
问题根源
你当前的调用方式不符合redisCommand的参数规则:
reply_r= (redisReply *)redisCommand(con_r,"script","load", "return 1");
hiredis的redisCommand函数,第二个参数是格式化命令模板,后面的参数是用来填充模板里的占位符(比如%s、%d)的,而不是直接把Redis命令的各个段拆成参数传递。你这里把"script"作为模板,但它没有任何占位符,却额外传了"load"和"return 1"两个参数,hiredis就会判定参数数量不匹配,抛出错误。
而Redis客户端是直接把命令拆分成参数数组发送给服务器,所以你手动输入script load "return 1"能正常执行,两者的参数传递逻辑完全不一样。
正确的两种写法
方式1:使用格式化模板(适合简单场景)
把完整的命令格式写出来,用%s占位符传递脚本内容:
reply_r = (redisReply *)redisCommand(con_r, "script load %s", "return 1");
注意:如果脚本里包含引号、换行这类特殊字符,要确保格式化逻辑不会出错。
方式2:使用redisCommandArgv(更推荐,适配复杂场景)
如果脚本内容复杂,或者想严格对齐Redis的参数结构,建议用redisCommandArgv——它直接接收参数数组和参数个数,逻辑和Redis客户端一致,更安全:
const char *argv[] = {"script", "load", "return 1"}; int argc = 3; reply_r = (redisReply *)redisCommandArgv(con_r, argc, argv, NULL);
额外的安全提示
别忘了加错误判断,避免空指针访问导致崩溃:
if (reply_r == NULL) { // 处理连接或命令发送失败的情况 return ""; } if (reply_r->type == REDIS_REPLY_ERROR) { printf("命令执行出错: %s\n", reply_r->str); freeReplyObject(reply_r); return ""; } // 后续正常处理逻辑...
内容的提问来源于stack exchange,提问作者Rsvay
相关产品推荐
相关产品推荐

