我正在尝试使用SET将我的结构的二进制blob保存为Redis(通过hiredis)中的值。我通过一次执行我的程序来设置它,并尝试稍后在另一次运行中检索它。出于某种原因,我无法获得动态分配的字符串。
这是我正在做的简化代码片段。在实际实现中,我的结构对于字符串,链表,子结构更复杂。
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);
我有以下问题:
我找不到任何能够解决我的用例的例子,所以任何例子都会有所帮助。
答案 0 :(得分:0)
由于变量to
包含字符串myStr
作为指向字符串而不是字符串本身的指针,因此您的代码无法正常运行:
reply = redisCommand(context,“SET%b%b”,key,(size_t)strlen(key),& t ,(size_t)vsize);
尝试使用它:
redisReply *reply = redisCommand(context, "SET %b %b", key, (size_t) strlen(key), t.myStr, t.myInt);
...
struct mytest;
memset(&mytest, 0, sizeof(mytest));
reply = redisCommand(context, "GET %b", key, (size_t) strlen(key));
mytest.myInt = strlen(reply->str);
mytest.myStr = strdup(reply->str);
freeReplyObject (reply);