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

标签 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. 如果是成员链表,应该如何存储?

我找不到任何示例来解决我的用例,因此任何示例都会有所帮助。

最佳答案

您的代码无法正常工作,因为变量 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);

关于c - 在 redis (hiredis) 中使用 SET 将 C 结构存储为二进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33728151/

相关文章:

c - 性能:在列 [OpenMP,C] 上高效减少二维数组

ruby - 如何将自定义 redis url 传递给 Rack::Session::Redis?

ruby-on-rails - rails : Namespace redis on a per-request basis for a multi-tenency app

redis - 如何在 Redis 中使用 HSCAN 命令?

c++ - hiredis ,如何检查是否有更多数据可供读取

redis - HiRedis::如何使用 LPUSH 在 Redis 列表中插入一个空字符串

c - 奇怪的数组字符串输出

c++ - Bitshift - 需要解释才能理解代码

Redis Sorted Set - 一次检索得分低于和高于成员的成员的命令

计算文本文件 C 中的帐户数量