memcache附加/前置谷歌协议缓冲区

时间:2012-03-19 16:38:38

标签: memcached protocol-buffers libmemcache libmemcached

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

我正在使用带有libmemcached的memcached和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编码documentation我知道重复的字段不必跟随另一个字段,因此应该可以交换其他类型的字段。

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

message SerialKeyList {
  repeated SerialKey key = 1;
}

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

1 个答案:

答案 0 :(得分:0)

你说得对 - te spec声明实现必须允许任何顺序的字段,特别是支持这种追加方案。

要追加的关键是它必须看起来仍然像SerialKeyList,即使你只用一个SerialKey或SerialBlackKey追加一个SerialKeyList。

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

有关更具体的答案,您可能需要说明如何构建它,并说明您正在使用的实现。