当前位置: 首页 > 面试题库 >

我们可以通过hireddis将C int数组设置为Redis中的键值吗?

公良征
2023-03-14
问题内容

给定:int x [3] = {11,22,33}; 如何将其作为键值保存为二进制数据并获取

hiredis提供了有关如何设置二进制安全字符串的示例

   /* Set a key using binary safe API */
   reply = redisCommand(c,"SET %b %b", "bar", (size_t) 3, "hello", (size_t) 5);
   printf("SET (binary API): %s\n", reply->str);
   freeReplyObject(reply);

但是其他数据又如何获取呢?


问题答案:

将二进制数据直接存储在远程存储中而不进行任何编组处理是灾难的根源。我不建议这样做:可以使用许多序列化协议来使二进制数据独立于平台。

也就是说,回答您的问题:

// This is the key
int k[3] = {11,22,33};

// This is the value
int v[4] = {0,1,2,3};
redisReply *reply = 0;

// Store the key/value: note the usage of sizeof to get the size of the arrays (in bytes)
reply = redisCommand(context, "SET %b %b", k, (size_t) sizeof(k), v, (size_t) sizeof(v) );
if (!reply)
    return REDIS_ERR;
freeReplyObject(reply);

// Now, get the value back, corresponding to the same key
reply = redisCommand(context, "GET %b", k, (size_t) sizeof(k) );
if ( !reply )
    return REDIS_ERR;
if ( reply->type != REDIS_REPLY_STRING ) {
    printf("ERROR: %s", reply->str);
} else {

    // Here, it is safer to make a copy to be sure memory is properly aligned
    int *val = (int *) malloc( reply->len );
    memcpy( val, reply->str, reply->len);
    for (int i=0; i<reply->len/sizeof(int); ++i )
        printf("%d\n",val[i]);
    free( val );
}
freeReplyObject(reply);

请注意,只有在确保所有Redis客户端在具有相同字节序和相同sizeof(int)的系统上运行时,此类代码才有效。



 类似资料:
  • 问题内容: 我想在numpy数组中设置特定值(以将它们从按行均值计算中排除)。 我试过了 看着,我只会看到我的期望。 我想到了一个替代方案: 没发生什么事。我究竟做错了什么? 问题答案: 将适当元素设置为NaN的矢量化方法 @unutbu的解决方案必须摆脱您得到的值错误。如果您希望获得性能,可以这样使用- 样品运行- 向量化方法可直接计算适当元素的按行平均值 如果要获取掩盖的平均值,则可以修改较早

  • 问题内容: 在实践中,我可以假定Java中的所有int数组都将以零填充开始吗?对于运行JVM的所有机器? 所有类型都适用吗?炭?布尔值?枚举? 正式记录在哪里? 我曾说过教科书将int数组设置为零,但他们也建议人们应该编写一个for循环将所有值设置为零,只是为了“更清晰”。 问题答案: Java语言规范是查找此类信息的正确位置: 数组组件 是未命名的变量,每当创建一个数组新对象时,该 组件 便会创

  • 问题内容: 所以我的数字程序有问题,我很好奇它是否是一个精度问题(即四舍五入误差)。有没有一种快速的方法可以将程序中的所有float数组都更改为数组,而无需遍历我的代码并在各处键入内容。我的数组都是float64,但我从未明确写过,所以我希望有办法改变这种默认行为。 问题答案: 我不认为您可以更改中央“配置”来实现此目的。您可以执行的一些选择: 如果仅通过NumPy的工厂函数中的很少一个来创建数组

  • 我目前使用的@Value Spring 3.1.x注释如下所示: 如果属性不存在,这会将一个空字符串放入变量中。我希望将null作为默认值,而不是空字符串。当然,我还希望避免在未设置属性stuff.value时出现错误。

  • 问题内容: 我们可以将字节数组转换为Java中的InputStream吗?我一直在上网,但找不到。 我有一个具有InputStream作为参数的方法。 我拥有的InputStream 是base64编码的,因此我不得不使用 现在如何再次转换为? 问题答案: 用途:

  • 问题内容: 我有一个Redis设置键’a’和值‘1’,‘2’,‘3’。是否可以为集合中的每个键值对设置不同的到期时间。 例如,(’a’,‘1’)应该在60秒后过期,而as(’a’,‘2’)应该在120秒后过期。 问题答案: 抱歉不行。Redis的“容器”(即列表,哈希,集合和排序集合)不支持按成员过期,尽管过去多次要求使用此功能。 但是,您可以实现自己的逻辑以实现该结果。解决此问题的方法有几种-