2

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

4

1 回答 1

1

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

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

想象一下您的对象非常大(例如几 MB),您不希望在每次查询时都解析它们。这就是为什么hiredis只解析格式字符串而不解析参数的原因。

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

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

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

于 2013-04-19T08:42:35.847 回答