2

SET を使用して、自分の構造のバイナリ BLOB を Redis の値として (hiredis 経由で) 保存しようとしています。プログラムの 1 回の実行で設定し、後で別の実行で取得しようとします。何らかの理由で、動的に割り当てられた文字列を取り戻すことができません。

これが、私がやっていることの単純化されたコードの断片です。実際の実装では、構造体は文字列、リンク リスト、サブ構造体でより複雑になります。

typedef struct mytest {
    int myInt;
    char *myStr;
} mytest;

char *key = strdup("test_key");
int vsize = 0;

mytest t;
memset(&t, 0, sizeof(t));
t.myInt = 100;
vsize += sizeof(t.myInt);
t.myStr = strdup("test_string");
vsize += strlen(t.myStr);

redisReply *reply = 0;

// set value
reply = redisCommand(context, "SET %b %b", key, (size_t) strlen(key), &t, (size_t) vsize);
if (!reply)
    return REDIS_ERR;
freeReplyObject(reply);

// get the value back
reply = redisCommand(context, "GET %b", key, (size_t) strlen(key));
struct mytest *retval = (struct mytest *) reply->str;

printf("GET %s: myInt = %d  myStr = %s", retval->myInt, retval->myStr);

次の質問があります。

  1. ここで何が間違っていますか?
  2. SET/GET は複雑なデータ構造を保存する正しい方法ですか、それとも Redis で何か他のものを使用する必要がありますか? 個別のフィールドとしてではなく、単一のエンティティとして構造にアクセスしたい。
  3. メンバー リンク リストの場合、それらをどのように保存する必要がありますか?

私のユースケースに対応する例が見つからなかったため、例があれば役立ちます。

4

1 に答える 1