Могу ли я использовать MGET с Hiredis? - PullRequest
0 голосов
/ 24 февраля 2012

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

#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?

Lorem Ipsum Dolor Sit Amet. Лорем ипсум долор сит амет. Лорем ипсум долор сит амет. Лорем ипсум долор сит амет. Лорем ипсум долор сит амет. Лорем ипсум долор сит амет. (Это для глупого контроля кода / соотношения текста.)

1 Ответ

1 голос
/ 24 февраля 2012

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

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

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 удаляет все дерево.

...