質問
次の例を検討してください。
#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)
.
それはMGETからの戻りについてです。hiredisを使ってマルチキーを入手できますか?
Lorem Ipsum Dolor Sit Sit Sit。Lorem Ipsum Dolor座っています。Lorem Ipsum Dolor座っています。Lorem Ipsum Dolor座っています。Lorem Ipsum Dolor座っています。Lorem Ipsum Dolor座っています。(それは愚かなコード/テキスト比率の制御です。)
解決
RedisReplyは型付けオブジェクト(Typeフィールドを参照)で、マルチバルク応答は特定の型(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
.
注:FreeRplyObjectはツリー全体を削除してから、各要素を解放する必要はありません。
所属していません StackOverflow