1

已解决:我尝试将单个 SerialKey 附加到列表中。当我现在用一个键附加一个 SerialKeyList 时,它可以正常工作。

我将 memcached 与 libmemcached 和 google 协议缓冲区一起使用,以在缓存中保存一个列表,该列表由元素列表和列入黑名单的元素列表组成。

.proto 是:

message SerialKeyList {
repeated SerialBlackKey bkey = 2;
repeated SerialKey key = 1;
}

message SerialKey {
optional string key = 1;
}

message SerialBlackKey {
optional string key = 2;
}

我想用 memcached_append() 附加 SerialKey 或 SerialBlackKey 类型的单个元素。我使用一个 SerialKey 元素(使用 memcached_set(SerialKeyList))初始化列表,然后附加一个 SerialBlackKey 元素(使用 memcached_append)。

从 memcached 解析列表并使用 PrintDebugString() 打印时得到的结果是

key {
  key: "REPL:http://a.host.com/replica" 
}
bkey {
  10: "PL:http://a.host.com/replica" 
}

因此创建了两个列表,但未正确读取第二个元素。

这应该是可能的吗?从 Protobuf 编码文档中,我了解到重复字段不必跟随另一个,因此应该可以交错其他类型的字段。

/ EDIT:列表中只有一种类型的元素(SerialKey)有同样的问题。这里我使用 SerialKey 上的另一个属性来确定它是否在黑名单中。原型:

message SerialKeyList {
  repeated SerialKey key = 1;
}

message SerialKey {
  required string key = 1;
  required bool white = 2 [default = true];
}
4

1 回答 1

0

你是对的 - 规范声明实现必须允许任何顺序的字段,特别是为了支持这种附加场景。

附加的关键是它必须仍然看起来像一个 SerialKeyList,即使您附加一个带有单个 SerialKey 或 SerialBlackKey 的 SerialKeyList。

另请注意:如果您使用的是字符串版本,我不知道附加是否有效 - 不过,二进制版本肯定是可附加的。

对于更具体的答案,您可能需要展示您是如何构建它的,并说明您正在使用哪种实现。

于 2012-03-19T16:51:34.233 回答