Question

Considérez l'exemple suivant:

#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 sortie est:

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

Il s'agit de retour de mget. Puis-je obtenir des touches multiples en utilisant 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. (C'est pour un contrôle stupide de code / rapport texte.)

Était-ce utile?

La solution

Une rediffusion est un objet typé (voir le champ de type), et une réponse multi-bulk a un type spécifique (redis_reply_array). Le champ STR n'est pas pertinent dans ce cas.

De la documentation 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.

Votre code doit donc être modifié comme suit:

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

Avec ce changement, la sortie est maintenant:

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

Remarque: il n'est pas nécessaire de libérer chaque élément individuel puisque FreerePlyObject supprime l'arbre entier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top