Pregunta

Considere el siguiente ejemplo:

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

La salida es:

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

Se trata de regreso de MGET.¿Puedo obtener claves múltiples usando Hircyis?

lorem ipsum dolor SIT AMet.Lorem ipsum dolor se sienta AMet.Lorem ipsum dolor se sienta AMet.Lorem ipsum dolor se sienta AMet.Lorem ipsum dolor se sienta AMet.Lorem ipsum dolor se sienta AMet.(Es para el control de código / código de texto estúpido.)

¿Fue útil?

Solución

A Redisreply es un objeto mecanografiado (consulte el campo Tipo), y una respuesta multi-bulk tiene un tipo específico (Redis_Reply_Array).El campo STR no es relevante en ese caso.

de la documentación de 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.

Entonces, su código debe cambiarse de la siguiente manera:

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

Con este cambio, la salida es ahora:

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

NOTA: No es necesario liberar cada elemento individual ya que FreeRePlyBject elimina el árbol entero.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top