2013-11-19 1 views
1

Я пытаюсь rpush в многословной строку в Redis ключа Но everyword становится добавлен новый элемент Как я могу избежать этогоrpush Multiword строка с пробелами в Redis с помощью hiredis

#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; 
} 

I ожидайте, что ответ будет 3 значения, но я получу 6 значений

ответ

2

Ну, это ожидаемое поведение. Вы должны использовать заполнитель параметров для создания своих команд. Пожалуйста, посмотрите на documentation.

Выдержки из 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); 

Кроме того, я предлагаю систематически проверять коды возврата API hiredis. Это может быть громоздким, но это сэкономит вам массу проблем на более позднем этапе вашего проекта.

+0

ответ = redisCommand (c, "RPUSH mylist% s", "element 2"); Работает нормально Как поймать ошибку этой команды reply-> str всегда имеет значение null – Ram

+0

См. Https://github.com/redis/hiredis#using-replies - проверьте хотя бы ответ не NULL, и answer-> type! = REDIS_REPLY_ERROR - в случае ошибки вы можете получить больше информации в c-> err и c-> errstr –