C 使用hiredis将带空格的多字字符串rpush到redis

C 使用hiredis将带空格的多字字符串rpush到redis,c,redis,hiredis,C,Redis,Hiredis,我正在尝试将多字字符串rpush到redis键 但是everyword作为一个新元素被添加进来了 我怎样才能避免这种情况 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <hiredis.h> int main(int argc, char **argv) { redisContext *c; redisReply *reply;

我正在尝试将多字字符串rpush到redis键 但是everyword作为一个新元素被添加进来了 我怎样才能避免这种情况

  #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <hiredis.h>

int main(int argc, char **argv) {
    redisContext *c;
    redisReply *reply;
    int j;
    struct timeval timeout = { 1, 500000 }; // 1.5 seconds                                                                                     
    c = redisConnectWithTimeout("192.168.77.101",6379, timeout);
    reply = redisCommand(c,"DEL mylist");
    freeReplyObject(reply);
    reply = redisCommand(c,"RPUSH mylist element 0");        freeReplyObject(reply);
    reply = redisCommand(c,"RPUSH mylist element 1");        freeReplyObject(reply);
    reply = redisCommand(c,"RPUSH mylist element 2");        freeReplyObject(reply);

    reply = redisCommand(c,"LRANGE mylist 0 -1");
    if (reply->type == REDIS_REPLY_ARRAY) {
        for (j = 0; j < reply->elements; j++) {
            printf("%u) %s\n", j, reply->element[j]->str);
        }
    }
    freeReplyObject(reply);
    redisFree(c);
    return 0;
}
#包括
#包括
#包括
#包括
int main(int argc,字符**argv){
重新定义上下文*c;
答复*答复;
int j;
struct timeval timeout={150000};//1.5秒
c=重新连接超时(“192.168.77.101”,6379,超时);
回复=redisCommand(c,“DEL mylist”);
freeReplyObject(回复);
reply=redisCommand(c,“RPUSH mylist元素0”);freeReplyObject(reply);
reply=redisCommand(c,“RPUSH mylist元素1”);freeReplyObject(reply);
reply=redisCommand(c,“RPUSH mylist元素2”);freeReplyObject(reply);
reply=redisCommand(c,“LRANGE mylist 0-1”);
if(reply->type==REDIS\u reply\u数组){
对于(j=0;jelements;j++){
printf(“%u)%s\n”,j,reply->element[j]->str);
}
}
freeReplyObject(回复);
可再贴现(c);
返回0;
}

我希望响应是3个值,但我得到6个值,这是预期的行为。您应该使用参数占位符来生成命令。请看一下这本书

摘自hiredis源代码:

/* Format a command according to the Redis protocol. This function
 * takes a format similar to printf:
 *
 * %s represents a C null terminated string you want to interpolate
 * %b represents a binary safe string
 *
 * When using %b you need to provide both the pointer to the string
 * and the length in bytes. Examples:
 *
 * len = redisFormatCommand(target, "GET %s", mykey);
 * len = redisFormatCommand(target, "SET %s %b", mykey, myval, myvallen);
 */
如果您按如下方式更改代码,它将修复问题

reply = redisCommand(c,"RPUSH mylist %s","element 0"); freeReplyObject(reply);
reply = redisCommand(c,"RPUSH mylist %s","element 1"); freeReplyObject(reply);
reply = redisCommand(c,"RPUSH mylist %s","element 2"); freeReplyObject(reply);
此外,我建议系统地测试hiredis API的返回代码。它可能很麻烦,但在项目的后期阶段,它会为您节省很多问题。

reply=redisCommand(c,“RPUSH mylist%s”,“element 2”);工作正常如何捕获此命令的错误reply->str始终设置为nullSee-检查至少reply不为NULL,以及reply->type!=REDIS\u REPLY\u ERROR-如果出现错误,您可以在c->err和c->errstr中获得更多信息