Могу ли я использовать MGET с арендодателем?

Рассмотрим следующий пример:

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <hiredis/hiredis.h>

int main(int argc, char **argv) {
  redisContext *redis;
  redisReply *reply;

  redis = redisConnect("127.0.0.1", 6379);
  if(redis->err) {
    fprintf(stderr, "Connection error: %s\n", redis->errstr);
    exit(EXIT_FAILURE);
  }

  reply = redisCommand(redis, "SET %s %s", "foo", "bar");
  printf("SET %s %s: %s\n", "foo", "bar", reply->str);
  freeReplyObject(reply);

  reply = redisCommand(redis, "SET %s %s", "name", "value");
  printf("SET %s %s: %s\n", "name", "value", reply->str);
  freeReplyObject(reply);

  reply = redisCommand(redis, "MGET %s %s", "foo", "name");
  printf("MGET %s %s: %s\n", "foo", "name", reply->str);
  freeReplyObject(reply);

  exit(EXIT_SUCCESS);
}

Результат:

PING: PONG
SET foo bar: OK
GET foo: bar
SET name value: OK
MGET foo name: (null)

Речь идет о возвращении с МГЭТ. Могу ли я получить несколько ключей с помощью Hiredis?


person Sebastian Sito    schedule 24.02.2012    source источник


Ответы (1)


RedisReply — это типизированный объект (см. поле типа), а групповой ответ имеет определенный тип (REDIS_REPLY_ARRAY). Поле str в этом случае не имеет значения.

Из документации по аренде:

The number of elements in the multi bulk reply is stored in reply->elements.
Every element in the multi bulk reply is a redisReply object as well
and can be accessed via reply->element[..index..].
Redis may reply with nested arrays but this is fully supported.

Таким образом, ваш код должен быть изменен следующим образом:

reply = redisCommand(redis, "MGET %s %s", "foo", "name" );
if ( reply->type == REDIS_REPLY_ERROR )
  printf( "Error: %s\n", reply->str );
else if ( reply->type != REDIS_REPLY_ARRAY )
  printf( "Unexpected type: %d\n", reply->type );
else 
{
  int i;
  for ( i=0; i<reply->elements; ++i )
    printf( "Result: %s\n", reply->element[i]->str );
}
freeReplyObject(reply);

С этим изменением вывод теперь:

SET foo bar: OK
SET name value: OK
Result: bar
Result: value

Примечание: нет необходимости освобождать каждый отдельный элемент, так как freeReplyObject удаляет все дерево.

person Didier Spezia    schedule 24.02.2012
comment
@Didier Spezia А как насчет HGETALL? Ключ и значение будут как element[i], верно? - person Vivek Goel; 28.11.2012
comment
Нет - я думаю, что ключ будет как элемент [i], а значение как элемент [i+1] - person Didier Spezia; 28.11.2012