使用redis中的SET将C结构存储为二进制(hiredis)

时间:2015-11-16 03:38:51

标签: c redis hiredis

我正在尝试使用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);

我有以下问题:

  1. 我在这里做错了什么?
  2. SET / GET是存储复杂数据结构的正确方法还是应该在Redis中使用其他东西?我想将结构作为单个实体访问,而不是作为单独的字段。
  3. 如果是会员链接列表,应该如何存储?
  4. 我找不到任何能够解决我的用例的例子,所以任何例子都会有所帮助。

1 个答案:

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