Pergunta

Considere o seguinte exemplo:

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

A saída é:

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

É sobre o retorno de MGET.Posso obter multi chaves usando hiredis?

Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.(É estúpido código/texto de controle de taxa.)

Foi útil?

Solução

Um redisReply é um tipo de objeto (ver o tipo de campo), e um multi-massa de resposta tem um tipo específico (REDIS_REPLY_ARRAY).O str de campo não é relevante nesse caso.

A partir do hiredis documentação:

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.

Assim, o código deve ser alterado da seguinte forma:

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);

Com esta mudança, a saída agora é:

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

Nota:não há necessidade de higiene individual de cada elemento, já freeReplyObject elimina toda a árvore.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top