【问题标题】:A redis command ERR:wrong number of argumentsredis命令错误:参数数量错误
【发布时间】:2013-04-19 03:39:46
【问题描述】:

使用hiredis 将命令传递给redis-server。 我的代码:

redisContext* c = redisConnect("127.0.0.1", 6379);
char y[15]={"pointx"};
strcat(y," 2");

redisReply* reply= (redisReply*)redisCommand(c,"set %s",y);
printf("%s\n", reply->str);

输出为“'set' 命令的参数数量错误”。 但是,当我像这样更改代码时它可以工作:

redisContext* c = redisConnect("127.0.0.1", 6379);
char y[15]={"pointx"};
char x[5] = {"2"};
redisReply* reply= (redisReply*)redisCommand(c,"set %s %s",y,x);
printf("%s\n", reply->str);

输出是“OK”。 为什么??

【问题讨论】:

    标签: redis hiredis


    【解决方案1】:

    Redis 服务器不解析使用 redisCommand 构建的命令。服务器只接受Redis protocol,带有已分隔的参数。

    因此,解析发生在hiredis中,并且它仅适用于格式字符串,一步到位。出于性能原因,hiredis 避免了多次格式化传递(或递归实现),因此参数的扩展不是在 解析之前完成,而是在 while 持续解析中完成 - 相反根据你的想法。

    假设您的对象非常大(比如几 MB),您不希望在每次查询时都对它们进行解析。这就是hiredis只解析格式字符串而不解析参数的原因。

    在您的第一个示例中,hiredis 使用唯一参数解析格式字符串,它仅使用一个参数构建消息,然后 redis 接收:

    $ netcat -l -p 6379
    *2
    $3
    set
    $8
    pointx 2
    

    这是一个格式错误的 set 命令(只有一个参数)。

    【讨论】:

      猜你喜欢
      • 2017-09-22
      • 2020-12-28
      • 2021-08-09
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多