一个redis命令ERR:错误的参数数量

时间:2013-04-19 03:39:46

标签: redis hiredis

使用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”。 为什么??

1 个答案:

答案 0 :(得分:1)

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

解析因此发生在hiredis中,并且它仅在格式字符串中应用,只需一步。出于性能原因,hiredis避免了多次格式化传递(或递归实现),因此在解析之前没有完成参数的扩展,而是正在进行解析时 - 相反你的想法。

想象一下你的对象非常大(比如几MB),你不希望在每个查询中解析它们。这就是hiredis只解析格式字符串而不解析参数的原因。

在第一个示例中,hiredis使用唯一参数解析格式字符串,它只使用一个参数构建一条消息,并且redis收到:

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

这是一个错误形成的设置命令(仅一个参数)。