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);
次の質問があります。
- ここで何が間違っていますか?
- SET/GET は複雑なデータ構造を保存する正しい方法ですか、それとも Redis で何か他のものを使用する必要がありますか? 個別のフィールドとしてではなく、単一のエンティティとして構造にアクセスしたい。
- メンバー リンク リストの場合、それらをどのように保存する必要がありますか?
私のユースケースに対応する例が見つからなかったため、例があれば役立ちます。